Java 6 процесор за анотации с реализация на Filer.createClassFile().

Опитвам се да напиша процесор за анотации в 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, но така и не можах да намеря пример с този метод.


person user1793318    schedule 06.01.2014    source източник
comment
Без връзка с конкретния въпрос, предлагам да използвате библиотека като JavaPoet (github.com/square/javapoet) за генериране на кода вместо твърдо кодиране на неща като къдрави скоби, запазени думи, точка и запетая и т.н.   -  person jpangamarca    schedule 13.06.2016
comment
Filer.createClassFile(..) е повреден в JDK 1.8 (компилация 1.8.0_121-b13). Пробвал съм да го използвам по много начини и никога не е работил. Въпреки това подобна функционалност би била полезна за копиране на предварително генерирани файлове, вместо да се правят изявления за генериране на източника.   -  person mljrg    schedule 16.03.2017


Отговори (1)


Ако проверите датите - Мартин коментира отговора през 2011 г. Намерих този въпрос през 2012 г. Реших, че той няма да се върне, за да му отговори. Джон, мога да те уверя, че поставих отговор само за протокола - за да отбележа този въпрос като отговорен.
person kapex    schedule 17.01.2014
comment
Да, съгласен. Сега са създадени src файлове вместо клас файлове. - person user1793318; 18.01.2014