如何获取类及其超类的注释列表

问题描述 投票:2回答:1

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

通过在声明类上使用方法getAnnotations(),结果表仅包含声明类注释,并忽略超类注释。如果我删除声明类的注释,则会出现超类注释。

我在这里错过了什么?

检索注释的简化方法:

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

(我正在尝试的所有注释都有@Inherited注释)

java inheritance reflection annotations
1个回答
1
投票

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

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和操作系统?

© www.soinside.com 2019 - 2024. All rights reserved.