[英]Java annotation cannot access protected static fields from upper class
這段代碼有效嗎?
public abstract class A {
protected static final String c = "my const";
}
@myAnnotation(value=A.c)
public class B extends A {
}
使用JDK 1.6.0.23的Eclipse
接受此功能,但帶有JDK 1.6.0.23的Maven
2.2.1顯示以下編譯錯誤:
c在A中有受保護的訪問權限
感謝@adranale的評論,我在訪問控制的Java語言規范部分找到了不同的答案。 我不認為它應該以這種方式工作,但有關“受保護”的相關文本讀取
設C是聲明受保護成員m的類。 僅允許在C的子類S的主體內訪問。
類的主體是大括號中的所有代碼。 類anotations在大括號之外,因此它們沒有訪問權限。 有趣的是,這種邏輯不適用於類體內的方法,參數,字段或局部變量注釋。
您嘗試使用“const”填充的Annotation嘗試使用無法工作的protected來從外部訪問該類。 Eclipse使用它自己的編譯器,因此您應該嘗試在Eclipse中進行干凈重建以查看它是否正常工作。 我認為它不會。
我想我看到這里發生了什么。 注釋的實例實際上是具有唯一靜態初始化器的接口。 注釋規范唯一添加的東西是語法糖和方法,類或字段的鏈接。 因此,當您鍵入value=cA
,幾乎就像在注釋中添加靜態初始化器一樣。 注釋不是A的子類,因此拒絕訪問。 受保護的訪問包括包訪問,因此當您將A移動到與B相同的包中時,注釋也與A在同一個包中。它可以訪問。 非常好的問題,我認為兩個編譯器的行為應該相同。 我認為Eclipse會讓你自定義它所處理的錯誤,這樣你就可以讓他們同意使用不受歡迎的,更具限制性的行為。
僅當A
和B
屬於同一個包時,此代碼才會編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.