Javac.exe Пример программного доступа к AST

Можно ли программно получить доступ к абстрактному синтаксическому дереву (AST) внутри javac.exe? Не могли бы вы привести пример?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
0
5 906
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, это возможно, но только начиная с Java 6. Петер фон дер Ае говорит о двух JSR в это интервью. JSR 199:

The JSR 199 Compiler API consists of three things: The first one basically allows you to invoke a compiler via the API. Second, the API allows you to customize how the compiler finds and writes out files. I mean files in the abstract sense, since the files the compiler deals with aren't necessarily on the file system. JSR 199's file abstraction allows you to have files in a database, and to generate output directly to memory, for example. Finally, the JSR 199 API lets you collect diagnostics from the compiler in a structured way so that you can easily transform error messages, for instance, into lines in an IDE's editor.

JSR 269 - это API обработки аннотаций.

эта статья дает отличный обзор доступа к API дерева компилятора. Раздел "Доступ к абстрактному синтаксическому дереву: API дерева компилятора" кажется особенно подходящим для вашего вопроса.

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

Скомпилируйте и запустите это с -cp tools.jar (где вы, очевидно, должны указать местоположение вашего tools.jar).

import com.sun.source.util.Trees;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class JCTreeTest {
    private static final JavaCompiler javac
            = ToolProvider.getSystemJavaCompiler();

    public static void main(String[] args) {
        final StandardJavaFileManager jfm
                = javac.getStandardFileManager(null, null, null);
        final JavaCompiler.CompilationTask task
                = javac.getTask(null, jfm, null, null, null,
                  jfm.getJavaFileObjects(args));
        final Trees trees = Trees.instance(task);
        // Do stuff with "trees"
    }
}

Он компилируется и запускается для меня, хотя я сам не играл с деревьями, так что вам придется прочтите javadoc самостоятельно. :-) Удачи!

Другие вопросы по теме

Linux для компиляции нескольких файлов java
Как увеличить максимальный размер кучи для процесса javac в Borland JBuilder 2005/2006
Почему мой класс не может быть запущен после объявления пакета и не может быть найден другим классом в том же пакете/папке?
Как решить проблему, приводящую к выводу сообщения об ошибке «класс не найден, неправильное имя класса»?
Как скомпилировать класс Java с помощью javac без каких-либо зависимостей даже от базовых классов, таких как java.lang.*?
Как вызвать ошибку/предупреждение сразу после компиляции/запуска, если элемент в моем пути к классу отсутствует
Проблема с запуском AspectJ Load-Time-Weaving с помощью команды java
Не удается запустить скомпилированный файл класса ajc в терминале с использованием Java
Получить значение как Class<?> для аннотации с помощью модуля jdk.compiler
Получить версию класса java из javac или JRE без скомпилированного класса