与 Annotation 有关的操作:
一、取得全部的 Annotation
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
class SimpleBeanOne{
@SuppressWarnings("unchecked")
@Deprecated
@Override
public String toString(){
return "Hello Java";
}
}
public class Test{
public static void main(String[] args) throws Exception{
Class<?> c = null;
c = Class.forName("SimpleBeanOne");
Method toM = c.getMethod("toString");//取得 toString() 方法
Annotation an[] = toM.getAnnotations();//取得全部的 Annotation
for (Annotation a:an){
System.out.println(a);
}
}
}
要想取得 SimpleBeanOne 中 toString() 方法的全部 Annotation,必须首先通过反射找到 toString() 方法。
这里虽然使用了 3 个 Annotation 注释,但是最后真正得到的只有一个,因为只有 Deprecated 使用了 RUNTIME 的方式声明,所以只有它可以取得。
二、取得指定的 Annotation 中的内容
可以使用 isAnnotationPresent() 方法进行判断:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
@Retention(value = RetentionPolicy.RUNTIME)//此 Annotation 在类执行时依然有效
@interface MyDefaultAnnotationReflect{
public String key() default "J1";
public String value() default "J2";
}
class SimpleBeanOne{
@SuppressWarnings("unchecked")
@Deprecated
@Override
// 使用自定义的 Annotation 并设置两个属性内容
@MyDefaultAnnotationReflect(key = "J3",value = "J4")
public String toString(){
return "Hello Java";
}
}
public class Test{
public static void main(String[] args) throws Exception{
Class<?> c = null;
c = Class.forName("SimpleBeanOne");
Method toM = c.getMethod("toString");
if (toM.isAnnotationPresent(MyDefaultAnnotationReflect.class)){
MyDefaultAnnotationReflect mda = null;//声明自定义的 Annotation
// 取得自定义的 Annotation
mda = toM.getAnnotation(MyDefaultAnnotationReflect.class);
String key = mda.key();
String value = mda.value();
System.out.println("key = " + key);
System.out.println("value = " + value);
}
}
}
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
可以发现适当的使用反射机制,就可以将 Annotation 中指定的内容设置到对应的操作中