Одним из способов решения этой проблемы является использование какого-либо реестра между сборками, например, вы можете хранить типы, аннотированные в стиле, подобном сервису, в meta-inf
Таким образом, в вашем процессоре вы откладываетегенерация кода до последнего раунда обработки, и после генерации вашего кода вы сохраняете типы в файле в файл под META-INF
FileObject resource = processingEnv.getFiler()
.createResource(StandardLocation.CLASS_OUTPUT, "", "META-INF/annotatedtypes/"+fileName);
PrintWriter out = new PrintWriter(new OutputStreamWriter(resource.openOutputStream()));
classes.forEach(out::println);
. Вы должны проверить наличие дублирующихся записей, конечно.
В какой-то момент перед генерацией кода прочитайте типы и сгенерируйте ваш код на основе этого
FileObject resource = processingEnv.getFiler()
.getResource(StandardLocation.CLASS_OUTPUT, "", "META-INF/annotatedtypes/"+fileName);
new BufferedReader(new InputStreamReader(resource.openInputStream())).lines().forEach(classes::add);
содержимое файла может выглядеть примерно так
org.foo.bar.A
org.foo.bar.B
Проблемаэто означает, что когда вы откладываете генерацию кода до последнего раунда, ваш сгенерированный код не будет выбран любым другим процессором, например dagger2, а также иногда файл может заканчиваться записями для классов, которых больше не существует.
В итоге внутри вашего процессора вы делаете следующее
- Чтение зарегистрированных типов из файлав META-INF
- Получить элементы, аннотированные вашей аннотацией.
- Если это последний раунд, просто обновите файл с уникальным набором записей и сгенерируйте код.
Вы читаете файл каждый раунд, но пишете только один раз в последнем раунде.