Java 注解无法从上层访问受保护的静态字段

问题描述 投票:0回答:4

此代码有效吗?

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 中具有受保护的访问权限

java annotations java-6
4个回答
3
投票

感谢@adranale 的评论,我在“访问控制”的 Java 语言规范部分找到了不同的答案。我认为它不应该这样工作,但有关“受保护”的相关文字如下 设 C 为声明受保护成员 m 的类。仅允许在 C 的子类 S 的体内进行访问。

类的主体是大括号中的所有代码。类注释位于大括号之外,因此它们无法访问。有趣的是,这种逻辑不适用于类体内的方法、参数、字段或局部变量注释。


2
投票
value=c.A

时,几乎就像向注释添加静态初始化程序一样。该注释不是 A 的子类,因此访问被拒绝。受保护的访问包括包访问,因此当您将 A 移至与 B 相同的包中时,注释也与 A 位于同一包中。它会获得访问权限。非常好的问题,我认为两个编译器的行为应该是相同的。我认为 Eclipse 会让您自定义它视为错误的内容,这样您就可以让他们同意都使用不良的、更具限制性的行为。

    


2
投票


1
投票
A

B
属于同一个包时,此代码才会编译。
    

© www.soinside.com 2019 - 2024. All rights reserved.