想象一下名为“MyAnn”的注释,包含运行时保留,类MyClass和一个名为MyData的抽象类。 MyClass有一个MyData类型的字段,用MyAnn注释。在MyData的实例中,如何查看注释MyAnn是否存在并检索其信息?
注意 - 在Java8中,我知道我们可以在构造时直接注释内部类 - 这是有效的 - 但我需要根据字段注释进行工作。
感谢您的帮助!
public MyClass extends MySuperClass() {
@MyAnn(value = "something")
protected MyData mydata;
public void doSomething() {
mydata = new MyData() {};
mydata.initialize();
}
}
public abstract MyData() {
String myValue = null;
public void initialize() {
if (***I am annotated with MyAnn) {
myValue = (***value from annotation MyAnn);
}
}
}
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnn {
String myvalue;
}
答案 0 :(得分:2)
MyData
无法直接知道它是否已使用MyAnn
注释,因为它不知道当前实例是字段还是独立实例,如果它是字段,那么是否该字段已经或未经过MyAnn
注释。
因此,您需要以某种方式获取并将value
传递给initialize()
,并且您需要以value
的方式获取initialize()
。从您的代码中可以看出,"something"
可以作为参数传递给initialize()
,使整个事情比注释字段更容易,然后检查该字段是否已注释。
但无论如何,如果你想检查一个字段是否有注释,你必须:
使用getClass().getDeclaredFields()
循环遍历字段;对于每个领域,
调用isAnnotationPresent( MyAnn.class )
或
调用field.getAnnotations()
,为每个注释循环,并检查是否annotation instanceof MyAnn.class
找到注释后,您可以使用annotation.value();