`
chaoyi
  • 浏览: 290405 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

反射与Annotation

 
阅读更多

本章目标
可以通过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
 * */
} 

 

 

 

 

 

  • 大小: 43.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics