我正在尝试将 spring @Controller
的 baseurl 外部化为 Controller 类的静态 String
成员。如果我这样做,我必须将成员声明为 public - 否则 @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";
...
}
最佳答案
注释是一个普通的 Java 类本身。它看不到带注释的类的成员,除非它们对它可见,使用普通的 Java 规则。此外,其他代码在运行时可能会使用注释的存在来对注释类的成员进行操作;如果这些成员不可见,则无法执行这些操作。
This page JDK文档包中讲了如何定义自定义注解,以及如何使用代码中应用的注解,在这方面很有启发。要定义注释类型,您可以执行以下操作
public @interface Copyright {
String value();
}
您的自定义注释被定义为一种特殊的 Java 接口(interface);在用户中,JVM 根据需要提供运行时实现。但要注意的关键是您如何使用您的自定义注释,例如:
Method m = ... // Get a java.lang.reflect.Method object from somewhere
if (m.hasAnnotation(Copyright.class)) ...
注意这里我们引用的是注解类型的类对象,说明一个注解被编译成普通的Java类型。
关于Java 类型级别注解和私有(private)成员可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19359474/