• <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-4-22 19:48 | 作者: 未知    | 來源: 網絡     | 查看: 29次 | 進入軟件測試論壇討論

    領測軟件測試網
      二、使用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/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品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>