国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

調用Java編譯器API編譯Java

2019-11-18 15:36:21
字體:
來源:轉載
供稿:網友
    從第一天開始,標準java平臺就缺少能夠被調用,去產生Java字節碼的編譯器接口. 使用Sun實現的平臺,一個用戶可以通過非標準的 com.sun.tools.javac  包中的Main class 去編譯你的代碼 (你可以在lib子目錄下的 tools.jar 文件里找到它). 然而這個包并沒有提供一個標準的公開的編程接口. 使用其它實現的用戶必然不能訪問這個類. 使用Java SE 6和在JSR-199中定義的它的新的Java編譯器接口,你可以從你自己的應用程序里訪問javac編譯工具了.

    有兩種方式使用這種工具. 一種是簡單的,一種是稍微復雜點但擁有更多選項的. 你首先將會用較簡單的一種去編譯 "Hello, World"程序,就是下面的這個:

public class Hello {
  public static void main(String args[]) {
    System.out.  }
}

    要想從Java程序里調用Java編譯器,你需要訪問JavaCompiler 接口. 除此外,通過訪問這個接口,你可以設置源代碼的路徑,classpath,和目標目錄. 通過指定可編譯的文件為 JavaFileObjectinstance ,你可以將它們全部編譯. 然而,你并不需要對 JavaFileObject 了解多少.

    可以使用 ToolProvider 類去請求 theJavaCompiler 接口的缺省實現. 這個 ToolProvider 類提供了一個 getSystemJavaCompiler() 方法, 它返回一個 JavaCompiler 接口的實例.

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

使用 JavaCompiler 運行編譯最簡單的方法是調用在這個接口工具里定義的 run() 方法,它的實現是:

int run(InputStream in,
    OutputStream out,
    OutputStream err,
    String... arguments)

    分別為前三個缺省參數 System.in, System.out, and System.err 傳入 null 值. 參數集 String 對象表示著傳入編譯器的文件的名稱.

這樣,你應該像下面這樣去編譯前面顯示的 Hello 源程序:

int results = tool.run(null, null, null, "Hello.java");

    假設沒有編譯錯誤,這樣會在目標目錄里產生一個 Hello.class文件. 假如這里有錯誤, run() 方法會把它輸出到標準錯誤輸出流里,也就是 run()  方法的的第三個參數. 當錯誤發生時這個方法返回一個非0的結果.

你可以使用下面的代碼去編譯 Hello.java 源文件:


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

public class CompileIt {
  public static void main(String args[]) throws IOException {
    JavaCompiler compiler =
        ToolProvider.getSystemJavaCompiler();
    int results = compiler.run(
        null, null, null, "Hello.java");
    System.out.println("Result code: " + results);
  }
}

一旦你編譯了 CompileIt 一次 ,你就可以多次運行它,當你修改了 Hello.java源程序時或者要重新編譯它,你不需要重新編譯 CompileIt . 假如沒有錯誤,運行 CompileIt 會產生下面的輸出:

> java CompileIt
Result code: 0


運行 CompileIt 同樣也會在相同的目錄下產生一個 Hello.class 文件:


> ls
CompileIt.class
CompileIt.java
Hello.class
Hello.java

    你可以完事了,因為這樣使用標準編譯器已經足夠了,可是這還有更有用的. 當你需要更好的處理這些結果時,你可以使用第二種方法來訪問編譯器. 更非凡的是,這第二種方式答應開發者將編譯輸出結果用一種更有意義的方式表現出來,而不是簡單的那種送往stdeer的錯誤文本. 利用 StandardJavaFileManager 類我們有這種更好的途徑使用編譯器. 這個文件治理器提供了一種方式,用來處理普通文件的輸入輸出操作. 它同時利用 DiagnosticListener 實例來報告調試信息. 你需要使用的 DiagnosticCollector 類其實是監聽器的一種實現.



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内黄县| 开远市| 义乌市| 济宁市| 万荣县| 屯留县| 蒙自县| 策勒县| 巴青县| 民县| 宁国市| 祁门县| 皋兰县| 汽车| 金乡县| 久治县| 万安县| 怀集县| 涞水县| 临汾市| 论坛| 禹城市| 浦江县| 扶绥县| 明光市| 佛冈县| 芦溪县| 宣城市| 花垣县| 汽车| 武冈市| 沾益县| 车致| 昆明市| 甘谷县| 措勤县| 铜鼓县| 剑阁县| 沂南县| 孝昌县| 老河口市|