Опитвам се да напиша процесор за анотации в 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()?
Опитах се да потърся в Google, но така и не можах да намеря пример с този метод.
Filer.createClassFile(..)
е повреден в JDK 1.8 (компилация 1.8.0_121-b13). Пробвал съм да го използвам по много начини и никога не е работил. Въпреки това подобна функционалност би била полезна за копиране на предварително генерирани файлове, вместо да се правят изявления за генериране на източника. - person mljrg   schedule 16.03.2017