簡體   English   中英

Java注釋無法訪問上層的受保護靜態字段

[英]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會讓你自定義它所處理的錯誤,這樣你就可以讓他們同意使用不受歡迎的,更具限制性的行為。

僅當AB屬於同一個包時,此代碼才會編譯。

暫無
暫無

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

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