采集编译器的诊断信息第三个新增加的功能,是收集编译过程中的诊断信息。诊断信息,通常指错误、警告或是编译过程中的详尽输出。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 effect05 }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