簡體   English   中英

創建實例的Java 8注釋

[英]Java 8 Annotations on Instance creation

在Javadocs for Annotations中,它指出可以用Java 8編寫以下內容:

new @Interned MyObject();

無論如何,是否可以通過反射從這樣注釋的對象中檢索注釋@Interned? 我熟悉從方法,字段,類等中獲取注釋的典型方法,但是我想知道是否有可能在Java 8運行時將特定實例與注釋相關聯。

new @Anno Object()一樣,應用於實例創建的注釋不是所創建對象的屬性,而僅是new表達式的(編譯時)類型的屬性。 在運行時,對象的實際類型沒有注釋,就像它沒有實例創建時可能已指定的泛型類型參數一樣。

請考慮以下示例:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface Anno { int value(); }

@Anno(1) Object o=new @Anno(2) Object();
@Anno(3) Object p=(@Anno(4) Object)o;

在這里,簡單對象經歷了幾種類型的更改,從@Anno(2) Object@Anno(1) Object再到@Anno(4) Object再到@Anno(3) Object ,在此代碼的末尾,同一對象是甚至由兩個不同類型的變量@Anno(1) Object@Anno(3) Object同時保存!

您可以使用審核工具來驗證這些類型轉換相對於@Anno所隱含的語義是否合法,但是對於Java語言本身而言,它們沒有任何意義,並且將始終被接受。 並且在運行時,實例的類型將始終是Object ,不受類型注釋的影響。

Reflection API提供了查詢類和成員的聲明的帶注釋的類型的方法,其中包括方法的參數和返回類型,但是您無法查詢new表達式的類型的注釋,因為您將無法找出方法是否真正包含一個new表達式,更不用說對該new表達式應用類型注釋了。

可能有第三方庫建立在字節碼處理庫上,它將在運行時提供對這些注釋的訪問…

暫無
暫無

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

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