javac.exe AST пример программного доступа
-
10-07-2019 - |
Вопрос
Можно ли получить программный доступ к абстрактному синтаксическому дереву (AST) внутри javac.exe? Не могли бы вы привести пример?
Решение
Да, это возможно, но только после Java 6. Питер фон дер Ах & # 233; рассказывает о двух JSR в этом интервью . JSR 199:
API компилятора JSR 199 состоит из трех вещей: первая в основном позволяет вызывать компилятор через API. Во-вторых, API позволяет вам настраивать, как компилятор находит и записывает файлы. Я имею в виду файлы в абстрактном смысле, поскольку файлы, с которыми работает компилятор, не обязательно находятся в файловой системе. Файловая абстракция JSR 199 позволяет вам иметь файлы в базе данных и генерировать вывод непосредственно в память, например. Наконец, API JSR 199 позволяет собирать диагностику из компилятора структурированным образом, что позволяет легко преобразовывать сообщения об ошибках, например, в строки в редакторе IDE.
JSR 269 - это API обработки аннотаций.
Эта статья дает отличный обзор доступа к API дерева компиляторов . Раздел " Доступ к абстрактному синтаксическому дереву: API дерева компиляторов а> & Quot; кажется, особенно подходит для вашего вопроса.
В зависимости от того, что вы делаете, вы также можете посмотреть на джекпот Язык правил , который представляет собой автономный механизм рефакторинга, который подключается к дереву компиляторов.
Другие советы
Скомпилируйте и запустите его с помощью -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 самостоятельно. :-) Удачи!