如何获得一个类及其超类的注释列表



我正在编写一个方法,该方法应该检索特定方法声明类及其超类的所有注释。

通过在声明类上使用getAnnotations()方法,结果表只包含声明类注释,而忽略超类注释。如果我删除了声明类的注释,那么超类的注释就存在了。

我在这里错过了什么?

检索注释的简化方法:

public void check(Method invokedMethod) {
    for (Annotation annotation : invokedMethod.getDeclaringClass().getAnnotations()) {
        // Do something ...
    }
}

(所有的注释,我试图得到有@Inherited注释)

如果您需要处理多个相同类型的注释,则标准方法不起作用,因为注释存储在以注释类型为键的Map中。(点击这里查看更多信息)。下面是我将如何解决这个问题(只需手动遍历所有超类):

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
public class AnnotationReflectionTest {
    public static void main(String[] args) throws Exception {
        check(Class2.class.getMethod("num", new Class[0]));
    }
    public static void check(Method invokedMethod) {
        Class<?> type = invokedMethod.getDeclaringClass();
        while (type != null) {
            for (Annotation annotation : type.getDeclaredAnnotations()) {
                System.out.println(annotation.toString());
            }
            type = type.getSuperclass();
        }
    }
}
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Annot1 {
    int num();
}
@Annot1(num = 5)
class Class1 {
    public int num() {
        return 1;
    }
}
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Annot2 {
    String text();
}
@Annot2(text = "ttt")
class Class2 extends Class1 {
    public int num() {
        return super.num() + 1;
    }
}

你用的是什么版本的Java和什么操作系统?

我必须用

写一个简单的方法
private <A extends Annotation> A getAnnotationFromType(Class<?> classType, final Class<A> annotationClass) {
    
    while ( !classType.getName().equals(Object.class.getName()) ) {
        
        if ( classType.isAnnotationPresent(annotationClass)) {
            return classType.getAnnotation(annotationClass);
        }
        classType = classType.getSuperclass();
    }
    return null;
    
}
    

这对大多数人来说可能是显而易见的,但是如果您来这里寻找类及其超类的字段,您可以使用

myClass.getFields()

获取所有字段,包括超类的字段,而不是

myClass.getDeclaredFields()

,它只返回类本身的字段。方法和构造函数也类似。

相关内容

  • 没有找到相关文章

最新更新