Java 类型级别注解和私有(private)成员可见性

标签 java annotations

我正在尝试将 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/

相关文章:

java - 如何在 Xtend 的 Active Annotations 中获得完整的返回类型转发?

java - 注释在编译时存在但在运行时不存在

java - 在java中连接计算税率的类

java - 并行处理 Set

java - 如何将 cURL 转换为改造正确的形式?

java - 将图像添加到 q 测验应用程序的数据库

java - 有什么办法让这个注释自动检查Java方法参数类型

java - 自定义注释处理、生成文档和 Maven 3

ios - 如何在放大时在 mkmapview 上显示更多注释并在缩小时显示更少?

java - C#按位异或(^)与Java按位异或(^)对比