java

位置:IT落伍者 >> java >> 浏览文章

Java进阶:在SE6中调用编译器的两种方法[2]


发布日期:2018年08月11日
 
Java进阶:在SE6中调用编译器的两种方法[2]

使用StandardJavaFileManager编译Java源程序

在第一部分我们讨论调用java编译器的最容易的方法这种方法可以很好地工作但它确不能更有效地得到我们所需要的信息如标准的输入输出信息而在Java SE中最好的方法是使用StandardJavaFileManager类这个类可以很好地控制输入输出并且可以通过 DiagnosticListener得到诊断信息而DiagnosticCollector类就是listener的实现

使用StandardJavaFileManager需要两步首先建立一个 DiagnosticCollector实例以及通过JavaCompiler的getStandardFileManager()方法得到一个 StandardFileManager对象最后通过CompilationTask中的call方法编译源程序

在使用这种方法调用Java编译时最复杂的方法就是getTask下面让我们讨论一下getTask方法这个方法有如下所示的个参数

getTask(Writer outJavaFileManager fileManager

DiagnosticListener diagnosticListener

Iterable options

Iterable classes

Iterable compilationUnits)

这些参数大多数都可为null它们的含义所下

·out:用于输出错误的流默认是Systemerr

·fileManager:标准的文件管理

·diagnosticListener: 编译器的默认行为

·options: 编译器的选项

·classes参与编译的class

最后一个参数compilationUnits不能为null因为这个对象保存了你想编译的Java文件

在使用完getTask后需要通过 StandardJavaFileManager的getJavaFileObjectsFromFiles或 getJavaFileObjectsFromStrings方法得到compilationUnits对象调用这两个方法的方式如下

Iterable getJavaFileObjectsFromFiles(

Iterable files)

Iterable getJavaFileObjectsFromStrings(

Iterable names)

String[] filenames = …;

Iterable compilationUnits =

fileManagergetJavaFileObjectsFromFiles(ArraysasList(filenames));

JavaCompilerCompilationTask task = compilergetTask(null fileManager

diagnostics options null compilationUnits);

最后需要关闭fileManagerclose();

下面是一个完整的演示程序

import javaio*;

import javautil*;

import javaxtools*;

public class test_compilerapi

{

private static void compilejava() throws Exception

{

JavaCompiler compiler = ToolProvidergetSystemJavaCompiler();

// 建立DiagnosticCollector对象

DiagnosticCollector diagnostics = new DiagnosticCollector();

StandardJavaFileManager fileManager = compilergetStandardFileManager(diagnostics null null);

// 建立用于保存被编译文件名的对象

// 每个文件被保存在一个从JavaFileObject继承的类中

Iterable compilationUnits = fileManager

getJavaFileObjectsFromStrings(Arrays asList(testjava));

JavaCompilerCompilationTask task = compilergetTask(null fileManager

diagnostics null null compilationUnits);

// 编译源程序

boolean success = taskcall();

fileManagerclose();

Systemoutprintln((success)?编译成功:编译失败);

}

public static void main(String args[]) throws Exception

{

compilejava();

}

}

[] [] [] []

               

上一篇:Java进阶:在SE6中调用编译器的两种方法[3]

下一篇:Java进阶:在SE6中调用编译器的两种方法[1]