Java如何获取所有注解?

要获取类,方法,构造函数或字段的所有注释,我们使用getAnnotations()方法。此方法返回一个数组Annotation

在以下示例中,我们尝试从该sayHi()方法读取所有注释。首先,我们需要获取自身的方法对象。因为sayHi()方法具有参数,所以我们不仅需要将方法名称传递给getMethod()方法,而且还需要传递参数的类型。

该getAnnotations()方法仅返回具有的注释RetentionPolicy.RUNTIME。因为其他保留策略不允许注释在运行时可用。

package org.nhooo.example.lang.annotation;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class GetAllAnnotation {
    private Map<String, String> data = new HashMap<>();

    @SuppressWarnings("unchecked")
    public static void main(String args[]) {
        GetAllAnnotation demo = new GetAllAnnotation();
        demo.sayHi("001", "Alice");
        demo.sayHi("004", "Malory");

        try {
            Class clazz = demo.getClass();

            // 要获得sayHi()方法,我们不仅需要传递方法
            // 名称及其参数类型,因此使用getMethod()方法
            // 返回正确的方法供我们使用。
            Method method = clazz.getMethod("sayHi", String.class, String.class);

            //从sayHi()方法获取所有注释。但这实际上
            //将仅返回一个注释。因为只有HelloAnnotation
            // 具有RUNTIME保留策略的注释,这意味着
            // 与sayHi()方法关联的其他注释不是
            // 在运行时可用。
            Annotation[] annotations = method.getAnnotations();
            for (Annotation anno : annotations) {
                System.out.println("Type: " + anno.annotationType());
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    @SuppressWarnings("unchecked")
    @MyAnnotation("Hi")
    @HelloAnnotation(value = "Hello", greetTo = "Everyone")
    public void sayHi(String dataId, String name) {
        Map data = getData();
        if (data.containsKey(dataId)) {
            System.out.println("Hello " + data.get(dataId));
        } else {
            data.put(dataId, name);
        }
    }

    private Map<String, String> getData() {
        data.put("001", "Alice");
        data.put("002", "Bob");
        data.put("003", "Carol");
        return data;
    }
}
package org.nhooo.example.lang.annotation;

public @interface MyAnnotation {
    String value();
}

检查HelloAnnotation以下链接上的“如何创建简单注释”。

此代码段的结果:

Hello Alice
Type: interface org.nhooo.example.lang.annotation.HelloAnnotation