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