10

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

4

2 回答 2

14

是的,这是可能的,但只是从 Java 6 开始。Peter von der Ahé在这次采访中谈到了这两个 JSR 。JSR 199:

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

JSR 269 是注释处理 API。

本文对访问Compiler Tree API进行了出色的概述。“访问抽象语法树:编译器树 API ”部分似乎特别适合您的问题。

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

于 2008-10-13T12:53:50.527 回答
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"
    }
}

它为我编译和运行,虽然我自己没有玩过树的东西,所以你必须自己阅读 javadoc。:-) 祝你好运!

于 2008-10-13T13:33:48.947 回答