你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Java专栏
Java SE 6新特性: 编译器 API(8)
 
实现逻辑和 清单 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 }

(编辑:aniston)

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089