javac.exe AST编程访问示例

是否可以通过编程方式访问javac.exe中的抽象语法树(AST)? 你能提供一个例子吗?

是的,这是可能的,但仅限于Java 6. Peter vonderAhé在本次访谈中谈到了两个JSR。 JSR 199:

JSR 199编译器API由三部分组成:第一部分基本上允许您通过API调用编译器。 其次,API允许您自定义编译器查找和写出文件的方式。 我的意思是抽象意义上的文件,因为编译器处理的文件不一定在文件系统上。 例如,JSR 199的文件抽象允许您在数据库中包含文件,并直接生成输出到内存。 最后,JSR 199 API允许您以结构化方式从编译器收集诊断,以便您可以轻松地将错误消息转换为IDE编辑器中的行。

JSR 269是注释处理API。

本文提供了访问Compiler Tree API的绝佳概述。 “ 访问抽象语法树:编译器树API ”部分似乎特别适合您的问题。

根据您正在做的事情,您可能还需要查看Jackpot Rule Language ,它是一个插入编译器树的独立重构引擎。

使用-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 。 :-) 祝好运!