Ada*_*old 7 java reflection annotations
我注意到如果我创建一个注释:
public @interface NullableTypeOverride {
NullableType hibernateTypeOverride();
}
Run Code Online (Sandbox Code Playgroud)
我对注释属性的选择有限.上面的代码不起作用,因为注释只为其属性采用原始String或Class类型.
所以在这种情况下我不能像这样使用这个注释:
@NullableTypeOverride(hibernateTypeOverride = Hibernate.INTEGER)
private Long distance;
Run Code Online (Sandbox Code Playgroud)
我的猜测是它与编译时间与运行时有关,但我不完全确定.那么这种限制的原因是什么,我该如何解决呢?
JLS 表示
如果在注释类型中声明的方法的返回类型不是以下之一,则是编译时错误:基本类型,字符串,类,类的任何参数化调用,枚举类型(第8.9节),注释类型或数组类型(第10节),其元素类型是前面的类型之一.
原因是注释必须具有恒定值.如果您提供可能更改的对象的引用,则会出现问题.这仅在注释的保留为止时才相关RUNTIME.
public class Person {
public String name;
}
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
Person person();
}
@MyAnnotation(person = ???) // how to guarantee it won't change at runtime?
public void method1() {...}
Run Code Online (Sandbox Code Playgroud)
应该是什么价值?反射库如何缓存呢?
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
annotation.person(); // should be the same value every time
Run Code Online (Sandbox Code Playgroud)
请记住,注释应该是元数据.