4

我正在尝试将弹簧的 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";
        ...
}
4

1 回答 1

5

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

JDK 文档包中的这个页面讨论了如何定义自定义注解,以及如何使用代码中应用的注解,在这方面很有启发性。要定义注释类型,您可以执行类似的操作

public @interface Copyright {
    String value();
}

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

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

注意这里我们指的是注解类型的类对象,说明注解被编译成普通的Java类型。

于 2013-10-14T11:50:00.553 回答