Java SE 6新特性: 编译器 API

豆豆网   技术应用频道   2007年08月11日    社区交流

内容摘要:本文是其中的第四篇,介绍了 JDK 6 中为在运行时操纵编译器所增加的编译器 API(JSR 199)。您将了解到,利用此 API 开发人员可以在运行时调用 Java 编译器,还可以编译非文本形式的 Java 源代码,最后还能够采集编译器的诊断信息。

  如果要使用 JavaFileManager,就必须构造 CompilationTask。JDK 6 提供了 JavaCompiler.CompilationTask 类来封装一个编译操作。这个类可以通过:

JavaCompiler.getTask (
  Writer out,
  JavaFileManager fileManager,
  DiagnosticListener<? super JavaFileObject> diagnosticListener,
  Iterable<String> options,
  Iterable<String> classes,
  Iterable<? extends JavaFileObject> compilationUnits
)

  方法得到。关于每个参数的含义,请参见 JDK 文档。传递不同的参数,会得到不同的 CompilationTask。通过构造这个类,一个编译过程可以被分成多步。进一步,CompilationTask 提供了 setProcessors(Iterable<? extends Processor>processors) 方法,用户可以制定处理 annotation 的处理器。图 1 展示了通过 CompilationTask 进行编译的过程:

  图 1. 使用 CompilationTask 进行编译

  Java SE 6新特性: 编译器 API

  下面的例子通过构造 CompilationTask 分多步编译一组 Java 源文件。

  清单 2. 构造 CompilationTask 进行编译

01 package math;
02 public class Calculator {
03   public int multiply(int multiplicand, int multiplier) {
04     return multiplicand * multiplier;
05   }
06 }
07 package compile;
08 import javax.tools.*;
09 import java.io.FileOutputStream;
10 import java.util.Arrays;
11 public class Compiler {
12  public static void main(String[] args) throws Exception{
13   String fullQuanlifiedFileName = "math" + java.io.File.separator +"Calculator.java";
14   JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
15   StandardJavaFileManager fileManager =
      compiler.getStandardFileManager(null, null, null);
16   Iterable<? extends JavaFileObject> files =
       fileManager.getJavaFileObjectsFromStrings(
       Arrays.asList(fullQuanlifiedFileName));
17   JavaCompiler.CompilationTask task = compiler.getTask(
       null, fileManager, null, null, null, files);
18   Boolean result = task.call();
19   if( result == true ) {
20    System.out.println("Succeeded");
21   }
22  }
23 }

来源:ibm    作者:沈 羽    责编:豆豆技术应用

正在加载评论...