要获取类,方法,构造函数或字段的所有注释,我们使用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