是否可以通过编程方式访问javac.exe中的抽象语法树(AST)?你能提供一个例子吗?
答案 0 :(得分:14)
是的,这是可能的,但仅限于Java 6. Peter von der Ahé谈论this interview中的两个JSR。 JSR 199:
JSR 199编译器API由三部分组成:第一部分基本上允许您通过API调用编译器。其次,API允许您自定义编译器查找和写出文件的方式。我的意思是抽象意义上的文件,因为编译器处理的文件不一定在文件系统上。例如,JSR 199的文件抽象允许您将文件放在数据库中,并直接生成输出到内存。最后,JSR 199 API允许您以结构化方式从编译器收集诊断信息,以便您可以轻松地将错误消息转换为IDE编辑器中的行。
JSR 269是注释处理API。
This article提供了访问Compiler Tree API的绝佳概述。 “Accessing the Abstract Syntax Tree: The Compiler Tree API”部分似乎特别适合您的问题。
根据您正在做的事情,您可能还需要查看Jackpot Rule Language,这是一个插入编译器树的独立重构引擎。
答案 1 :(得分:6)
使用-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"
}
}
它为我编译和运行,虽然我自己没有玩过树木,所以你必须自己read the javadoc。 :-)祝你好运!