为什么注释字符串值不会被拦截?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

尽管重复使用了一个字符串常量和文字,以下代码片段将打印4个不同的散列码。为什么字符串值不在注释元素上?

public class Foo {
    @Retention(RetentionPolicy.RUNTIME)
    @interface Bar {
        String CONSTANT = "foo";

        String value() default CONSTANT;
    }

    public static void main(String[] args) throws Exception {
        System.out.println(System.identityHashCode(Bar.CONSTANT));
        System.out.println(System.identityHashCode(Foo.class.getMethod("test1").getAnnotation(Bar.class).value()));
        System.out.println(System.identityHashCode(Foo.class.getMethod("test2").getAnnotation(Bar.class).value()));
        System.out.println(System.identityHashCode(Foo.class.getMethod("test3").getAnnotation(Bar.class).value()));
    }

    @Bar
    public void test1() {}

    @Bar("foo")
    public void test2() {}

    @Bar(Bar.CONSTANT)
    public void test3() {}
}
提问于
用户回答回答于

字符串文字是内部的,但是注释是要解析的,它们存储在字节数组中。如果你看看这java.lang.reflect.Method类,你可以看到:

private byte[]              annotations;
private byte[]              parameterAnnotations;
private byte[]              annotationDefault;  

用户回答回答于

扫码关注云+社区