java compiler API使用

import java.io.IOException;
import java.util.Arrays;

import javax.tools.Diagnostic;
import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

public class CompilerDemo {
    
    public static void main(String[] args) {
        compiler1();
        compiler2();
    }

    /**
     * 使用ToolProvider类来获得JavaCompiler接口的一个默认实现。ToolProvider类提供一个getSystemJavaCompiler()方法,返回JavaCompiler接口的一个实例
     * 使用JavaCompiler最简单的方法是直接调用run()方法,run()方法是在Tool接口中实现的
     */
    public static void compiler1() {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        int results = compiler.run(null, null, null, "MBeanDemo.java");
        System.out.println("Result code: " + results);
    }

    /**
     * 这个方法利用了 StandardJavaFileManager类的优点。这个文件管理器提供了一种方法来完成普通文件的输入输出工作。
     * 同时在一个 DiagnosticListener实例的帮助下报告编译的诊断信息。后面将要用到的DiagnosticCollector类只是前面那个 listener的一个实现。
                    在确定什么东西是需要编译的之前,你需要一个文件管理器。创建一个文件管理器需要两个基本的步骤:
                    创建一个DiagnosticCollector然后使用getStandardFileManager()方法向JavaCompiler申请文件管理器。
                    传递 DiagnosticListener实例作为getStandardFileManager()方法的参数。
                    这个listener报告非致命性的错误,你也可以选择通过将它传递给getTask()方法与编译器共享这个listener
     */
    public static void compiler2() {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
        Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList("MBeanDemo.java"));
        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null,
                                                             compilationUnits);
        Boolean success = task.call();
        for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
            System.console().printf("Code: %s%n" + "Kind: %s%n" + "Position: %s%n" + "Start Position: %s%n"
                                            + "End Position: %s%n" + "Source: %s%n" + "Message:   %s%n",
                                    diagnostic.getCode(), diagnostic.getKind(), diagnostic.getPosition(),
                                    diagnostic.getStartPosition(), diagnostic.getEndPosition(), diagnostic.getSource(),
                                    diagnostic.getMessage(null));
        }
        try {
            fileManager.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Success: " + success);
    }

}

输出:

    Result code: 0

    Success: true


posted @ 2012-05-31 13:35  MXi4oyu  阅读(449)  评论(0编辑  收藏  举报