簡體   English   中英

編譯器如何處理注釋?

[英]How compiler deals with annotations?

我有一些關於在java中使用注釋的問題。

如果注釋無法轉換為字節碼,那么這些信息會在哪里發生? 元數據在哪里? Java Reflection如何使用這些信息?

編譯器如何處理注釋?

當我們說,

@Override
public void doSomething(){
}

java編譯器用它做什么?

我知道它會檢查方法簽名,以便該方法應該是一個完全重寫的方法,但是如何?

有三種類型的注釋,請參閱http://download.oracle.com/javase/6/docs/api/java/lang/annotation/RetentionPolicy.html

@Override是一種特殊情況,因為編譯器會執行其他檢查。

@Override是一個類型注釋 - 用於檢查特定方法是否遵循重寫方法的約定 - 因此它在運行時不可用(因此在編譯的字節碼中邏輯上不存在)。

我知道它檢查方法簽名,以便該方法應該是一個完全重寫的方法,但如何

在讀取源文件並將它們轉換為字節碼的過程中,例如,根本不使用反射。 有關其他編譯器信息,請參閱Java編程語言編譯器 - javac

注釋,例如@Override實現為public @interface @Override {}具有RetentionPolicy ,它可以允許注釋存儲在類文件( RetentionPolicy.CLASSRetentionPolicy.RUNTIME )中或被丟棄( RetentionPolicy.SOURCE )。

@Override方法的RetentionPolicy為RetentionPolicy.SOURCE ,目標為ElementType.METHOD (意味着此方法只能在方法聲明上注釋)。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

PS如果要反射性地閱讀注釋,則必須在RetentionPolicy.RUNTIME設置RetentionPolicy.RUNTIME

首先,有兩種注釋:運行時可訪問(2種)而不是運行時可訪問。 注釋的行為由保留策略通過注釋聲明的注釋完成:-)。 例:

@Retention(RetentionPolicy.RUNTIME) // effectively visible to JVM Runtime
public @interface MethodInfo {
    String author() default "unspecified";
    String lastModification() default "unspecified"; // Format: yyyy-mm-dd
    ImplementationStatus implementationStatus();
}

JVM運行時可見注釋可以在帶注釋的代碼執行期間(或由JVM加載時)通過反射進行訪問。 您將這些注釋用作元數據持有者。 元數據可以由其他代碼處理以執行各種事情,例如。 在執行給定方法之前檢查帶注釋的方法實現狀態。

但有人必須編寫代碼才能通過反射使用注釋matedata! 最好的示例是應用程序服務器(AS),它根據需要從JAR文件中加載類,這些文件位於某個特定目錄中。 AS可以包含檢查每個已加載類的代碼,以查找由@Initialization批注注釋的靜態方法,並立即執行這些方法。 此注釋類型由AS定義,為AS創建JAR和類的人在開發期間使用它。

在運行期間不可用的注釋將在編譯期間使用並計算出來。 @Override是很好的例子。 編譯器插件可以使用自定義源僅注釋,或者如果代碼由其他代碼按需編譯。

這個很簡單。 編譯器只檢查超類中具有相同名稱和相同數量的參數,它們的順序和類型的方法。 如果方法具有@Override注釋並且未找到此方法,則會生成錯誤。

更有趣的問題是編譯器如何處理在運行時具有意義的注釋。 我假設它們是在字節碼中添加的,但是在一些帶有元信息的特殊部分中。 因此,在運行時jvm可以訪問meta部分。 作為證明,您始終可以在任何class對象上調用getAnnotations()

編譯注釋(最終是常量數據)存在於類文件中,可以使用適當的方法getAnnotations()和朋友進行訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM