Java类型级别注释和私有成员可见性

时间:2013-10-14 11:44:15

标签: java annotations

我正在尝试将spring @Controller的baseurl外部化为控制器类的静态String成员。如果我这样做,我必须公开该成员 - 否则它将不会被@RequestMapping注释看到。我不明白为什么 - 这不是班级的注释部分吗?

有人可以解释为什么我不得不在这里使用private吗?

无效:

@Controller
@RequestMapping(PendingApprovalsController.CONTROLLER_URL)
public class PendingApprovalsController {
    private static final String CONTROLLER_URL = "/some/url";
        ...
}

有效:

@Controller
@RequestMapping(PendingApprovalsController.CONTROLLER_URL)
public class PendingApprovalsController {
    public static final String CONTROLLER_URL = "/some/url";
        ...
}

1 个答案:

答案 0 :(得分:5)

注释是一个普通的Java类本身。除非使用普通的Java规则对它们可见,否则它无法看到带注释的类的成员。此外,注释的存在可以由运行时的其他代码用于对注释类的成员进行操作;如果这些成员不可见,则无法执行这些操作。

来自JDK文档包的

This page讨论了如何定义自定义注释,以及如何使用代码中应用的注释,这在这方面具有启发性。要定义注释类型,请执行类似

的操作
public @interface Copyright {
    String value();
}

您的自定义注释被定义为一种特殊的Java接口;在用户中,JVM根据需要提供运行时实现。但需要注意的关键是如何使用自定义注释,例如:

Method m = ... // Get a java.lang.reflect.Method object from somewhere
if (m.hasAnnotation(Copyright.class)) ...

请注意,这里我们引用注释类型的类对象,证明注释被编译为普通的Java类型。