• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Java SE6調用Java編譯器的兩種新方法(二)

    發表于:2007-04-22來源:作者:點擊數: 標簽:javaSE6編譯器兩種nbsp
    二、使用StandardJavaFileManager編譯Java源程序 在第一部分我們討論調用 java 編譯器的最容易的方法。這種方法可以很好地工作,但它確不能更有效地得到我們所需要的信息,如標準的輸入、輸出信息。而在Java SE6中最好的方法是使用StandardJavaFileManager類
      二、使用StandardJavaFileManager編譯Java源程序

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

      使用 StandardJavaFileManager需要兩步。首先建立一個DiagnosticCollector實例以及通過JavaCompiler的 getStandardFileManager()方法得到一個StandardFileManager對象。最后通過CompilationTask中的call方法編譯源程序。
    在使用這種方法調用Java編譯時最復雜的方法就是getTask,下面讓我們討論一下getTask方法。這個方法有如下所示的6個參數。

    getTask(Writer out,JavaFileManager fileManager,
    DiagnosticListener<? super JavaFileObject> diagnosticListener,
    Iterable<String> options,
    Iterable<String> classes,
    Iterable<? extends JavaFileObject> compilationUnits)

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

      ·out::用于輸出錯誤的流,默認是System.err。

      ·fileManager::標準的文件管理。

      ·diagnosticListener: 編譯器的默認行為。

      ·options: 編譯器的選項

      ·classes:參與編譯的class。

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

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

    Iterable<? extends JavaFileObject> getJavaFileObjectsFromFiles(
    Iterable<? extends File> files)
    Iterable<? extends JavaFileObject> getJavaFileObjectsFromStrings(
    Iterable<String> names)

    String[] filenames = …;
    Iterable<? extends JavaFileObject> compilationUnits =
    fileManager.getJavaFileObjectsFromFiles(Arrays.asList(filenames));

    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
    diagnostics, options, null, compilationUnits);

      最后需要關閉fileManager.close();

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

    import java.io.*;
    import java.util.*;
    import javax.tools.*;

    public class test_compilerapi
    {
     private static void compilejava() throws Exception
     {
      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
      // 建立DiagnosticCollector對象
      DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
      StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
      // 建立用于保存被編譯文件名的對象
      // 每個文件被保存在一個從JavaFileObject繼承的類中
      Iterable<? extends JavaFileObject> compilationUnits = fileManager
    .getJavaFileObjectsFromStrings(Arrays asList("test3.java"));
      JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
    diagnostics, null, null, compilationUnits);
      // 編譯源程序
      boolean success = task.call();
      fileManager.close();
      System.out.println((success)?"編譯成功":"編譯失敗");
     }
     public static void main(String args[]) throws Exception
     {
      compilejava();
     }
    }

      如果想得到具體的編譯錯誤,可以對Diagnostics進行掃描,代碼如下:

    for (Diagnostic diagnostic : diagnostics.getDiagnostics())
    System.out.printf(
    "Code: %s%n" +
    "Kind: %s%n" +
    "Position: %s%n" +
    "Start Position: %s%n" +
    "End Position: %s%n" +
    "Source: %s%n" +
    "Message: %s%n",
    diagnostic.getCode(), diagnostic.getKind(),
    diagnostic.getPosition(), diagnostic.getStartPosition(),
    diagnostic.getEndPosition(), diagnostic.getSource(),
    diagnostic.getMessage(null));

      被編譯的test.java代碼如下:

    public class test
    {
     public static void main(String[] args) throws Exception
     {
      aa; //錯誤語句
      System.out.println("JavaCompiler測試成功!");
     }
    }

      在這段代碼中多寫了個aa,得到的編譯錯誤為:

    Code: compiler.err.not.stmt
    Kind: ERROR
    Position: 89
    Start Position: 89
    End Position: 89
    Source: test.java
    Message: test.java:5: 不是語句
    Success: false

      通過JavaCompiler進行編譯都是在當前目錄下生成.class文件,而使用編譯選項可以改變這個默認目錄。編譯選項是一個元素為String類型的Iterable集合。如我們可以使用如下代碼在D盤根目錄下生成.class文件。

    Iterable<String> options = Arrays.asList("-d", "d:\\");
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager,
    diagnostics, options, null, compilationUnits);

      在上面的例子中options處的參數為null,而要傳遞編譯器的參數,就需要將options傳入。

      有時我們編譯一個Java源程序文件,而這個源程序文件需要另幾個Java文件,而這些Java文件又在另外一個目錄,那么這就需要為編譯器指定這些文件所在的目錄。

    Iterable<String> options = Arrays.asList("-sourcepath", "d:\\src");

      上面的代碼指定的被編譯Java文件所依賴的源文件所在的目錄。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>