日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java编译器使用教程_Java编译器API简介

發(fā)布時間:2025/3/15 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java编译器使用教程_Java编译器API简介 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天給大家分享的是Java編譯器API簡介,文章部分內(nèi)容摘自【優(yōu)銳課】學(xué)習(xí)筆記。

Java編譯器API

Java編譯器API是Java模塊(稱為java.compiler)的一部分。該模塊包括語言模型和注釋處理,以及編譯器API。它定義了Java編程語言和編譯器工具的類型和模型聲明,可以在執(zhí)行期間從應(yīng)用程序代碼中調(diào)用它們。注釋處理有助于訪問注釋處理器,可以將其視為Java編譯器的插件。它使注釋處理器和注釋處理工具環(huán)境之間能夠通信。模型,元素和類型包處理Java編程語言的元素,而util包則幫助處理程序元素和類型。

編譯工具

javax.tools包提供了與Java編譯器一起使用的接口和類,并且可以在執(zhí)行期間從程序中調(diào)用它。 它提供了一個框架,該框架允許客戶端從其自己的應(yīng)用程序代碼定位和運行編譯器。它還提供了服務(wù)提供者接口(SPI),用于對診斷的結(jié)構(gòu)化訪問和用于覆蓋文件訪問的文件抽象。ToolProvider類提供了編譯器API的入口點。此類提供了一些方法來定位編譯器的工具提供者。 例如,我們可以輕松地找到系統(tǒng)中安裝的編譯器支持的Java源版本列表。

1 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

2 for(SourceVersion sv:compiler.getSourceVersions()){

3 System.out.println(sv);

4 }

輸出如下(根據(jù)系統(tǒng)中安裝的版本)。

1 RELEASE_3

2 RELEASE_4

3 RELEASE_5

4 RELEASE_6

5 RELEASE_7

6 RELEASE_8

7 RELEASE_9

8 RELEASE_10

9 RELEASE_11

在這種情況下,ToolProvider會找到默認的編譯器。通過使用服務(wù)提供者機制,還可以找到替代的編譯器或工具。如果某些供應(yīng)商提供Java編譯器,則jar文件將包含文件META-INF / service / javax.tool.JavaCompiler,并且將包含一行:com.vendor.VendorJavaCompiler。我們可以將jar文件放入類路徑中,并按以下方式定位它:

1 JavaCompiler vendorJavaCompiler =

2 ServiceLoader.load(JavaCompiler.class).iterator().next();

ServiceProvider是Java的util類之一,用于查找和加載部署在執(zhí)行環(huán)境中的服務(wù)提供者。

找到JavaCompiler后,就可以通過Java源代碼執(zhí)行各種編譯診斷任務(wù)。為了說明這個想法,讓我們首先創(chuàng)建一個簡單的類,如下所示:

1 package com.mano.jcapidemo;

2 import java.util.Random;

3 public class MyClass {

4 public static void main(String[] args){

5 Random r = new Random();

6 System.out.println("Today your Lucky Number is:

7 "+r.nextInt(10));

8 }

9 }

現(xiàn)在,在創(chuàng)建Java源文件之后,我們可以使用名為DiagnosticCollector的診斷收集器類將診斷收集在列表中。

創(chuàng)建另一個類,從該類中我們將調(diào)用編譯器來編譯上述類MyClass,并將診斷信息報告給該類。換句話說,我們將創(chuàng)建一個應(yīng)用程序來加載Java源文件,并由Java編譯器對其進行編譯,并且,如果源代碼中有任何錯誤,請確保將其報告給主機應(yīng)用程序。

1 package com.mano.jcapidemo;

2

3 import com.mano.annotation.CustomAnnotation;

4 import java.util.Set;

5 import javax.annotation.processing.AbstractProcessor;

6 import javax.annotation.processing.RoundEnvironment;

7 import javax.annotation.processing.SupportedAnnotationTypes;

8 import javax.annotation.processing.SupportedSourceVersion;

9 import javax.lang.model.SourceVersion;

10 import javax.lang.model.element.Element;

11 import javax.lang.model.element.ElementKind;

12 import javax.lang.model.element.TypeElement;

13 import javax.tools.Diagnostic;

14 @SupportedAnnotationTypes("com.mano.annotation.CustomAnnotation")

15 @SupportedSourceVersion(SourceVersion.RELEASE_10)

16 public class CustomAnnotationProcessor extends

17 AbstractProcessor {

18 public CustomAnnotationProcessor() {

19 } public Boolean process(Set extends

20 TypeElement> annotations,

21 RoundEnvironment roundEnv) {

22 for (Element e : roundEnv.getElementsAnnotatedWith

23 (CustomAnnotation.class)) {

24 if (e.getKind() != ElementKind.FIELD) {

25 processingEnv.getMessager().printMessage(

26 Diagnostic.Kind.WARNING,

27 "Not a field", e);

28 continue;

29 }

30 }

31 return true;

32 }

33 }

編譯器依賴于兩種服務(wù):診斷偵聽器和文件管理器。如果提供了偵聽器,則將診斷信息提供給偵聽器;否則,將向偵聽器提供診斷信息。否則,診斷將以未指定的格式格式化,并定向到默認的錯誤輸出系統(tǒng)(System.err)。默認情況下,編譯器工具與標(biāo)準(zhǔn)文件管理器關(guān)聯(lián),并且可以與滿足其要求的任何其他文件管理器一起正常工作。

注釋處理器

編譯過程還包括注釋處理器。它執(zhí)行編譯由注釋驅(qū)動的代碼的附加過程。處理過程按一系列輪次進行,其中每個輪次處理其上一輪產(chǎn)生的注釋子集。實現(xiàn)注釋過程的接口是javax.annotation.processin.Processor。實現(xiàn)類必須提供一個無參數(shù)的構(gòu)造函數(shù),以供工具實例化處理器。處理基礎(chǔ)結(jié)構(gòu)應(yīng)遵循某些協(xié)議,例如:

通過使用處理器類的無參數(shù)構(gòu)造函數(shù)實例化注釋處理器。

工具通過傳遞適當(dāng)?shù)腜rocessingEnvironmentinstance實例來調(diào)用init方法。

這些工具調(diào)用由Processor接口定義的方法,例如getSupportedAnnotationTypes(),?getSupportedOptions(), 和getSupportedSourceVersion()。這些方法在每次運行中調(diào)用一次,而不是在每個回合中調(diào)用一次。

最后,調(diào)用Processor對象上的process ()方法。

例如,簡單的注釋可以定義如下:

1 package com.mano.jcapidemo;

2 import java.lang.annotation.ElementType;

3 import java.lang.annotation.Target;

4 @Target(ElementType.FIELD)

5 public@interface CustomAnnotation {

6 }

一個非常簡單的注釋處理器,用于警告將注釋應(yīng)用于字段以外的任何其他元素,如下所示:

1 package com.mano.jcapidemo;

2

3 import com.mano.annotation.CustomAnnotation;

4 import java.util.Set;

5 import javax.annotation.processing.AbstractProcessor;

6 import javax.annotation.processing.RoundEnvironment;

7 import javax.annotation.processing.SupportedAnnotationTypes;

8 import javax.annotation.processing.SupportedSourceVersion;

9 import javax.lang.model.SourceVersion;

10 import javax.lang.model.element.Element;

11 import javax.lang.model.element.ElementKind;

12 import javax.lang.model.element.TypeElement;

13 import javax.tools.Diagnostic;

14 @SupportedAnnotationTypes("com.mano.annotation.CustomAnnotation")

15 @SupportedSourceVersion(SourceVersion.RELEASE_10)

16 public class CustomAnnotationProcessor extends

17 AbstractProcessor {

18 public CustomAnnotationProcessor() {

19 } public Boolean process(Set extends

20 TypeElement> annotations,

21 RoundEnvironment roundEnv) {

22 for (Element e : roundEnv.getElementsAnnotatedWith

23 (CustomAnnotation.class)) {

24 if (e.getKind() != ElementKind.FIELD) {

25 processingEnv.getMessager().printMessage(

26 Diagnostic.Kind.WARNING,

27 "Not a field", e);

28 continue;

29 }

30 }

31 return true;

32 }

33 }

SupportedAnnotationTypes定義注釋處理器將處理哪種類型的注釋,SupportedSourceVersion定義其支持的版本。 我們首先擴展AbstractProcessor抽象類,該類允許我們覆蓋處理方法。 處理方法內(nèi)部編寫的邏輯完成了所有技巧,這些技巧涉及我們選擇設(shè)置哪些標(biāo)準(zhǔn)來處理注釋。 這最終決定了注釋的含義。

元素掃描儀

元素掃描器在編譯過程中對所有語言元素執(zhí)行分析。它根據(jù)訪問者模式構(gòu)建,以根據(jù)源版本的發(fā)布情況,以默認行為掃描程序元素。例如,ElementScanner9根據(jù)源版本RELEASE_9和RELEASE_10進行掃描,而ElementScanner8分別根據(jù)源版本RELEASE_8進行掃描。這兩個類都可以在javax.lang.model.utilpackage中找到。

編譯樹API Compiler Tree API

有時,有必要將整個Java源文件解析為抽象語法樹,尤其是為了進行更深入的分析。Java編譯器樹API遵守該要求,并與javax.lang.model包緊密關(guān)聯(lián)。它以與元素掃描器相同的模式構(gòu)建,并且以類似的方式工作。密鑰類稱為TreePathScanner。它訪問所有子樹節(jié)點,并有助于維護到父節(jié)點的路徑。要訪問特定節(jié)點,我們可以簡單地覆蓋相應(yīng)的visitorXYZ方法。

總結(jié)

Java編譯器API從Java應(yīng)用程序中提供對Java編譯器的編程訪問。顯而易見,此API有更深層的含義,在這里我們只涉及了其中的內(nèi)容。但是,此快速介紹可能會提供有關(guān)在開始使用Java Compiler API時要查找的內(nèi)容的線索。

參考

Java API文檔

關(guān)于找一找教程網(wǎng)

本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。

本站提供了軟件編程、網(wǎng)站開發(fā)技術(shù)、服務(wù)器運維、人工智能等等IT技術(shù)文章,希望廣大程序員努力學(xué)習(xí),讓我們用科技改變世界。

[Java編譯器API簡介]http://www.zyiz.net/tech/detail-97085.html

總結(jié)

以上是生活随笔為你收集整理的java编译器使用教程_Java编译器API简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。