在Java SE6中调用编译器的两种方法(1)
int results = tool.run(null, null, null, "test.java");
下面是使用JavaCompiler的完整代码:
import java.io.*;
import javax.tools.*;
public class test_compilerapi
{
public static void main(String args[]) throws IOException
{
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int results = compiler.run(null, null, null, "test.java");
System.out.println((results == 0)?"编译成功":"编译失败");
// 在程序中运行test
Runtime run = Runtime.getRuntime();
Process p = run.exec("java test");
BufferedInputStream in = new BufferedInputStream(p.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String s;
while ((s = br.readLine()) != null)
System.out.println(s);
}
}
public class test
{
public static void main(String[] args) throws Exception
{
System.out.println("JavaCompiler测试成功!");
}
}
编译成功的输出结果:编译成功
JavaCompiler测试成功
编译失败的输出结果:
test.java:9: 找不到符号
符号: 方法 printlnln(java.lang.String)
位子: 类 java.io.PrintStream
System.out.printlnln("JavaCompiler测试成功!");
^
1 错误
编译失败
二、使用StandardJavaFileManager编译Java源程序
在第一部分我们讨论调用java编译器的最容易的方法。这种方法可以很好地工作,但它确不能更有效地得到我们所须要的信息,如标准的输入、输出信息。
而在Java SE6中最好的方法是使用StandardJavaFileManager类。这个类可以很好地操纵输入、输出,并且可以通过DiagnosticListener得到诊断信息,而DiagnosticCollector类就是listener的实现。
使用StandardJavaFileManager须要两步。首先建立一个DiagnosticCollector实例以及通过JavaCompiler的getStandardFileManager()方法得到一个StandardFileManager对象。最后通过CompilationTask中的call方法编译源程序。
在使用这种方法调用Java编译时最复杂的方法就是getTask,下面让我们讨论一下getTask方法。这个方法有如下所示的6个参数。
getTask(Writer out,JavaFileManager fileManager,
DiagnosticListener diagnosticListener,
Iterable options,
Iterable classes,
Iterable compilationUnits)
这些参数大多数都可为null。它们的含义所下。·out::用于输出错误的流,默认是System.err。
·fileManager::标准的文件管理。·diagnosticListener: 编译器的默认行为。
·options: 编译器的选项
·classes:参与编译的class。最后一个参数compilationUnits不能为null,因为这个对象保存了你想编译的Java文件。
在使用完getTask后,需要通过StandardJavaFileManager的getJavaFileObjectsFromFiles或getJavaFileObjectsFromStrings方法得到compilationUnits对象。
