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

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

  二 使用StandardJavaFileManager编译Java源程序
  在第一部分我们讨论调用java编译器的最容易的方法 这种方法可以很好地工作 但它确不能更有效地得到我们所需要的信息 如标准的输入 输出信息 而在Java SE 中最好的方法是使用StandardJavaFileManager类 这个类可以很好地控制输入 输出 并且可以通过 DiagnosticListener得到诊断信息 而DiagnosticCollector类就是listener的实现
  使用StandardJavaFileManager需要两步 首先建立一个 DiagnosticCollector实例以及通过JavaCompiler的getStandardFileManager()方法得到一个 StandardFileManager对象 最后通过CompilationTask中的call方法编译源程序
  在使用这种方法调用Java编译时最复杂的方法就是getTask 下面让我们讨论一下getTask方法 这个方法有如下所示的 个参数

  getTask(Writer out JavaFileManager fileManager   DiagnosticListener diagnosticListener   Iterable options   Iterable classes   Iterable pilationUnits)
  这些参数大多数都可为null 它们的含义所下
  ·out: 用于输出错误的流 默认是System err
  ·fileManager: 标准的文件管理
  ·diagnosticListener: 编译器的默认行为
  ·options: 编译器的选项
  ·classes 参与编译的class
  最后一个参数pilationUnits不能为null 因为这个对象保存了你想编译的Java文件
  在使用完getTask后 需要通过 StandardJavaFileManager的getJavaFileObjectsFromFiles或 getJavaFileObjectsFromStrings方法得到pilationUnits对象 调用这两个方法的方式如下
  Iterable getJavaFileObjectsFromFiles(  Iterable files)  Iterable getJavaFileObjectsFromStrings(  Iterable names)  String[] filenames = …;  Iterable pilationUnits =  fileManager getJavaFileObjectsFromFiles(Arrays asList(filenames));  JavaCompiler CompilationTask task = piler getTask(null fileManager   diagnostics options null pilationUnits);
  最后需要关闭fileManager close();
  下面是一个完整的演示程序
  import java io *;  import java util *;  import javax tools *;  public class test_pilerapi  {  private static void pilejava() throws Exception   {   JavaCompiler piler = ToolProvider getSystemJavaCompiler();   // 建立DiagnosticCollector对象   DiagnosticCollector diagnostics = new DiagnosticCollector();   StandardJavaFileManager fileManager = piler getStandardFileManager(diagnostics null null);   // 建立用于保存被编译文件名的对象   // 每个文件被保存在一个从JavaFileObject继承的类中   Iterable pilationUnits = fileManager   getJavaFileObjectsFromStrings(Arrays asList( test java ));   JavaCompiler CompilationTask task = piler getTask(null fileManager    diagnostics null null pilationUnits);   // 编译源程序   boolean success = task call();   fileManager close();   System out println((success)? 编译成功 : 编译失败 );   }  public static void main(String args[]) throws Exception   {   pilejava();   }  }

lishixinzhi/Article/program/Java/hx/201311/27242
2022-11-04
mengvlog 阅读 25 次 更新于 2025-09-10 09:22:00 我来答关注问题0
  • import java io *;import java util *;import javax tools *;public class test_pilerapi{private static void pilejava() throws Exception { JavaCompiler piler = ToolProvider getSystemJavaCompiler(); // 建立DiagnosticCollector对象 DiagnosticCollector diagnostics = new DiagnosticCollector(); Standard...

  • import java io *;import javax tools *;public class test_pilerapi{   public static void main(String args[]) throws IOException   {   JavaCompiler piler = ToolProvider getSystemJavaCompiler();   int results = piler run(null null null test java );   System out print...

  •  翡希信息咨询 如何解决OSX 10.11系统中Java SE 6的兼容性问题?

    重启系统:使用命令行sudo shutdown r now进行重启,以确保所有配置生效。注意:以上步骤是基于升级到Java SE 8后的配置调整,旨在使OSX 10.11系统能够更好地兼容原本可能需要Java SE 6的应用或环境。在实际操作中,请确保已备份重要数据,并谨慎进行每一步操作。

  •  翡希信息咨询 Java (TM) SE Runtime Enrironment 6 Update 是什么程序?

    Java SE是Java平台的标准版本,适用于桌面和服务器环境。Runtime Environment:即运行环境。Java SE Runtime Environment提供了运行Java程序所需的所有组件,包括Java虚拟机、核心类库等。6 Update:表示这是Java SE 6版本的一个更新包。更新包通常包含性能改进、安全修复和新功能等。主要用途: 软件运行:...

  • 能够从应用程序内部对类进行编译这一实现使得代码生成具有了交互性-我可以以交互方式来修改和构建类。为了支持Java脚本编程,Java SE 6支持JSR 223,这是一种提供了到Java内部进行存取的脚本语言的框架标准。你可以定位脚本引擎并且在运行时调用它们以运行脚本。该脚本编程API允许你为选择的脚本语言提供Java...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部