Я пытаюсь написать обработчик аннотаций на Java 6. Я написал пример реализации, которая создает новый исходный файл в методе процесса и отлично работает.
@SupportedAnnotationTypes(value = {"*"})
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class BrownfieldAnnotationProcessor extends AbstractProcessor{
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
try {
JavaFileObject f = processingEnv.getFiler().
createSourceFile("in.test.ExtraClass");
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE,
"Creating " + f.toUri());
Writer w = f.openWriter();
try {
PrintWriter pw = new PrintWriter(w);
pw.println("package in.test;");
pw.println("public class ExtraClass implements TestInterface{");
pw.println(" public void print() {");
pw.println(" System.out.println(\"Hello boss!\");");
pw.println(" }");
pw.println("}");
pw.flush();
} finally {
w.close();
}
} catch (IOException x) {
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,
x.toString());
}
return true;
}
}
Но в моем случае я не хочу, чтобы создавался другой файл java, и вместо этого я хочу напрямую сгенерировать файл класса. Как создать файл класса? Следует ли мне использовать динамический компилятор для компиляции этого источника в строку для создания класса? В этом сценарии я могу напрямую хранить файлы классов в файловой системе. Как используется метод processingEnv.getFiler (). CreateClassFile ()?
Я пробовал погуглить, но так и не смог найти пример, использующий этот метод.
Filer.createClassFile(..)
не работает в JDK 1.8 (сборка 1.8.0_121-b13). Я тестировал его по-разному, но он никогда не работал. Тем не менее, такая функциональность была бы полезна для копирования ранее сгенерированных файлов, вместо того, чтобы делать инструкции для генерации источника. - person mljrg   schedule 16.03.2017