【问题标题】:javac.exe AST programmatic access examplejavac.exe AST 编程访问示例
【发布时间】:2008-10-13 09:03:28
【问题描述】:

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

【问题讨论】:

    标签: java javac abstract-syntax-tree


    【解决方案1】:

    是的,这是可能的,但只是从 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,它是一个独立的重构引擎,可插入编译器树。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-09
        • 2020-10-25
        • 2015-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        相关资源
        最近更新 更多