本章目标
可以通过Java反射机制取得使用的全部Annotation
可以通过Java反射机制取得指定的Annotation
通过反射取得Annotation
如果要想让一个Annotation起作用,则必须结合反射机制。在Class类中存在以下几种与Annotation操作有关的方法
定义一个简单类
例如:现在有如下的类使用了系统的三个内建Annotation
public class SimpleBeanOne {
@SuppressWarnings("unchecked") // 使用@SuppressWarnings的Annotation
@Deprecated // 使用@Deprecated的Annotation
@Override // 使用@Override的Annotation
public String toString() { // 覆写toString()方法
return "chaoyi!!!" ; // 返回信息
}
}
取得全部的Annotation
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class ReflectDemo01 {
public static void main(String args[]) throws Exception {// 所有异常抛出
Class<?> c = null ; // 取得Class实例
c = Class.forName("SimpleBeanOne") ;
Method toM = c.getMethod("toString"); // 取得toString()方法
Annotation an[] = toM.getAnnotations(); // 取得全部的Annotation
for (Annotation a : an) { // foreach输出
System.out.println(a); // 直接输出信息
}
}
/* 结果:
* @java.lang.Deprecated()
* */
}
取得自定义的Annotation
以上的程序是取得了一个元素所声明的全部RUNTIME的Annotation,但是有时候需要取得的是某个指定的Annotation,所以此时在取得之前就必须进行明确的判断,使用isAnnotationPresent()方法进行判断。
定义一个RUNTIME的Annotation
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(value=RetentionPolicy.RUNTIME) // 此Annotation在类执行时依然有效
public @interface MyDefaultAnnotationReflect {
public String key() default "choayi" ; // 定义一个key变量,默认值为“choayi”
public String value() default "阅谁问君诵,水落清香浮" ; // 定义一个value变量,默认值为“阅谁问君诵,水落清香浮”
}
在类中使用Annotation
public class SimpleBeanTwo {
@SuppressWarnings("unchecked") // 使用@SuppressWarnings的Annotation
@Deprecated // 使用@Deprecated的Annotation
@Override // 使用@Override的Annotation
// 使用自定义的Annotation并设置两个属性内容
@MyDefaultAnnotationReflect(key = "baidu", value = "www.baidu.cn")
public String toString() { // 覆写toString()方法
return "Hello Chaoyi!!!" ; // 返回信息
}
}
取得指定的Annotation
import java.lang.reflect.Method;
public class ReflectDemo02 {
public static void main(String args[]) throws Exception {
Class<?> c = null ; // 取得Class实例
c = Class.forName("SimpleBeanTwo") ;
Method toM = c.getMethod("toString"); // 取得toString()方法
if (toM.isAnnotationPresent(MyDefaultAnnotationReflect.class)) {
MyDefaultAnnotationReflect mda = null; // 声明自定义的Annotation对象
// 取得自定义的Annotation
mda = toM.getAnnotation(MyDefaultAnnotationReflect.class);
String key = mda.key(); // 得到Annotation中指定变量的内容
String value = mda.value();// 得到Annotation中指定变量的内容
System.out.println("key = " + key);// 输出Annotation中的key
System.out.println("value = " + value);// 输出Annotation中的value
}
}
/* 结果:
* key = baidu
* value = www.baidu.cn
* */
}