[英]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.