熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java進階:在SE6中調用編譯器的兩種方法[2]

2022-06-13   來源: Java核心技術 

  二使用StandardJavaFileManager編譯Java源程序

  在第一部分我們討論調用java編譯器的最容易的方法這種方法可以很好地工作但它確不能更有效地得到我們所需要的信息如標准的輸入輸出信息而在Java SE中最好的方法是使用StandardJavaFileManager類這個類可以很好地控制輸入輸出並且可以通過 DiagnosticListener得到診斷信息而DiagnosticCollector類就是listener的實現

  使用StandardJavaFileManager需要兩步首先建立一個 DiagnosticCollector實例以及通過JavaCompiler的getStandardFileManager()方法得到一個 StandardFileManager對象最後通過CompilationTask中的call方法編譯源程序

  在使用這種方法調用Java編譯時最復雜的方法就是getTask下面讓我們討論一下getTask方法這個方法有如下所示的個參數

  getTask(Writer outJavaFileManager fileManager
  DiagnosticListener diagnosticListener
  Iterable options
  Iterable classes
  Iterable compilationUnits)

  這些參數大多數都可為null它們的含義所下

  ·out:用於輸出錯誤的流默認是Systemerr

  ·fileManager:標准的文件管理

  ·diagnosticListener: 編譯器的默認行為

  ·options: 編譯器的選項

  ·classes參與編譯的class

  最後一個參數compilationUnits不能為null因為這個對象保存了你想編譯的Java文件

  在使用完getTask後需要通過 StandardJavaFileManager的getJavaFileObjectsFromFiles或 getJavaFileObjectsFromStrings方法得到compilationUnits對象調用這兩個方法的方式如下

  Iterable getJavaFileObjectsFromFiles(
  Iterable files)
  Iterable getJavaFileObjectsFromStrings(
  Iterable names)
  String[] filenames = …;
  Iterable compilationUnits =
  fileManagergetJavaFileObjectsFromFiles(ArraysasList(filenames));
  JavaCompilerCompilationTask task = compilergetTask(null fileManager
  diagnostics options null compilationUnits);

  最後需要關閉fileManagerclose();

  下面是一個完整的演示程序

  import javaio*;
  import javautil*;
  import javaxtools*;
  public class test_compilerapi
  {
  private static void compilejava() throws Exception
   {
   JavaCompiler compiler = ToolProvidergetSystemJavaCompiler();
   // 建立DiagnosticCollector對象
   DiagnosticCollector diagnostics = new DiagnosticCollector();
   StandardJavaFileManager fileManager = compilergetStandardFileManager(diagnostics null null);
   // 建立用於保存被編譯文件名的對象
   // 每個文件被保存在一個從JavaFileObject繼承的類中
   Iterable compilationUnits = fileManager
   getJavaFileObjectsFromStrings(Arrays asList(testjava));
   JavaCompilerCompilationTask task = compilergetTask(null fileManager
   diagnostics null null compilationUnits);
   // 編譯源程序
   boolean success = taskcall();
   fileManagerclose();
   Systemoutprintln((success)?編譯成功:編譯失敗);
   }
  public static void main(String args[]) throws Exception
   {
   compilejava();
   }
  }

[]  []  []  []  


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27242.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.