Java SE 6新特性: 编译器 API

http://tech.ddvip.com   2007年08月11日    社区交流

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

  实现逻辑和 清单 2 相似。不同的是在 20-30 行,程序在内存中构造了 CalculatorTest 类,并且通过 StringObject 的构造函数,将内存中的字符串,转换成了 JavaFileObject 对象。

  采集编译器的诊断信息

  第三个新增加的功能,是收集编译过程中的诊断信息。诊断信息,通常指错误、警告或是编译过程中的详尽输出。JDK 6 通过 Listener 机制,获取这些信息。如果要注册一个 DiagnosticListener,必须使用 CompilationTask 来进行编译,因为 Tool 的 run 方法没有办法注册 Listener。步骤很简单,先构造一个 Listener,然后传递给 JavaFileManager 的构造函数。清单 5 对 清单 2 进行了改动,展示了如何注册一个 DiagnosticListener。

  清单 5. 注册一个 DiagnosticListener 收集编译信息

01 package math;
02 public class Calculator {
03  public int multiply(int multiplicand, int multiplier) {
04   return multiplicand * multiplier
     // deliberately omit semicolon, ADiagnosticListener
     // will take effect
05  }
06 }
07 package compile;
08 import javax.tools.*;
09 import java.io.FileOutputStream;
10 import java.util.Arrays;
11 public class CompilerWithListener {
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    DiagnosticCollector<JavaFileObject> collector =
      new DiagnosticCollector<JavaFileObject>();
18    JavaCompiler.CompilationTask task =
      compiler.getTask(null, fileManager, collector, null, null, files);
19   Boolean result = task.call();
20   List<Diagnostic<? extends JavaFileObject>> diagnostics =
      collector.getDiagnostics();
21   for(Diagnostic<? extends JavaFileObject> d : diagnostics){
22     System.out.println("Line Number->" + d.getLineNumber());
23      System.out.println("Message->"+
          d.getMessage(Locale.ENGLISH));
24      System.out.println("Source" + d.getCode());
25      System.out.println("
");
26   }
27   if( result == true ) {
28    System.out.println("Succeeded");
29   }
30  }
31 }

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

正在加载评论...