Обработчик аннотаций 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 ()?

Я пробовал погуглить, но так и не смог найти пример, использующий этот метод.


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)


Я вижу только несколько причин для создания файлов классов вместо файлов исходного кода. На самом деле это те же причины, по которым вам когда-либо понадобится создавать байт-код вручную в любой ситуации.

Я думаю, что вам редко нужно делать что-либо из вышеперечисленного. Если это действительно то, что вы хотите сделать, вам следует много знать о формат файлов классов и, конечно же, байт-код. На этом этапе вы, по сути, создадите какой-то компилятор.

Вы можете возразить, что, отправляя предварительно скомпилированные классы или напрямую генерируя байт-код, вы можете пропустить какой-либо шаг в построенном процессе, и программа пользователя будет компилироваться быстрее. Это может быть правдой, но я уверен, что скоростью можно будет пренебречь. Было бы проще просто поработать с исходным кодом и передать его файловой системе для компиляции.

Следует ли мне использовать динамический компилятор для компиляции этого источника в строку для создания класса?

Нет, я не вижу здесь преимущества. Если вы создадите файл исходного кода с помощью файлового механизма, он будет автоматически скомпилирован. Вам нужно сделать это только в том случае, если ваш исходный код - это не Java, а какой-то другой язык, который вы хотите скомпилировать для JVM.

person kapex    schedule 17.01.2014
comment
Да, согласен. Созданы файлы src вместо файлов классов. - person user1793318; 18.01.2014