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

时间:2012-05-30 10:07:37

标签: java compiler-construction annotations jdk1.6

这段代码有效吗?

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接受此,但Maven 2.2.1与JDK 1.6.0.23显示以下编译错误:

  

c在A

中具有受保护的访问权限

4 个答案:

答案 0 :(得分:3)

感谢@adranale的评论,我在Access Control的Java语言规范部分找到了不同的答案。我不认为它应该以这种方式工作,但有关“受保护”的相关文字读取

设C是声明受保护成员m的类。只允许在C的子类S的主体内访问。

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

答案 1 :(得分:2)

您尝试使用“const”填充的注释尝试使用无法工作的protected从外部访问该类。 Eclipse使用它自己的编译器,因此您应该尝试在Eclipse中进行干净重建以查看它是否正常工作。我认为不会。

答案 2 :(得分:2)

我想我知道这里发生了什么。注释的实例实际上是具有唯一静态初始化器的接口。注释规范唯一添加的东西是语法糖和方法,类或字段的链接。因此,当您键入value=c.A时,几乎就像在注释中添加静态启动器一样。注释不是A的子类,因此拒绝访问。受保护的访问包括包访问,因此当您将A移动到与B相同的包中时,注释也与A在同一个包中。它可以访问。非常好的问题,我认为两个编译器的行为应该相同。我认为Eclipse会让你自定义它所处理的错误,这样你就可以让他们同意使用不受欢迎的,更具限制性的行为。

答案 3 :(得分:1)

只有当AB属于同一个软件包时,才会编译此代码。