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




Да, это возможно, но только начиная с 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 самостоятельно. :-) Удачи!