代码之家  ›  专栏  ›  技术社区  ›  hawkeye

javac.exe ast编程访问示例

  •  10
  • hawkeye  · 技术社区  · 16 年前

    是否可以通过编程方式访问javac.exe内部的抽象语法树(ast)?你能举个例子吗?

    2 回复  |  直到 6 年前
        1
  •  14
  •   M. Prokhorov    6 年前

    是的,这是可能的,但仅从Java 6开始。 Peter von der Ahé 讨论两个JSR this interview . JSR 199:

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

    JSR 269是注释处理API。

    This article 对访问 Compiler Tree API . “一节” Accessing the Abstract Syntax Tree: The Compiler Tree API “似乎特别适合你的问题。

    根据你所做的,你可能还想看看 Jackpot Rule Language 这是一个独立的重构引擎,可以插入到编译器树中。

        2
  •  6
  •   C. K. Young    16 年前

    编译并运行此 -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 你自己。-祝你好运!