反射应用:动态读取注解

在运行时读取某个注解信息

一个完整的注解,有三个要素:

  • (1)声明
  • (2)使用
  • (3)读取

像@Override,@SuppressWarings,@Deprecated等这些是JRE中声明的,也是由编译器读取的
像@Test,@Before…等这些注解是JUnit声明和读取的
像@author,@param…等这些注解是JRE中声明的,由javadoc.exe读取的

我们程序员只负责使用。

如果我们自定义的注解,那么声明和读取我们就要自己编写了

获取类上面的注解
步骤:

  • (1)获取Class对象
  • (2)获取注解对象
  • (3)获取注解的配置参数的值

获取属性上面的注解
步骤:

  • (1)获取Class对象
  • (2)获取属性对象Field对象
  • (3)获取注解对象Annotation
  • (4)获取注解的配置参数的值
@Target({TYPE,FIELD})
@Retention(RetentionPolicy.RUNTIME)//只有生命周期是运行时,那么才可以被反射读取
@interface MyAnnotation{
	String value();  //如果配置参数只有一个,名称是value,在使用时,赋值的话就可以省略"value="
}

//使用注解
@MyAnnotation("哈哈哈")
class MyClass{
	@MyAnnotation("hahaha")
	private String info;

}

public class TestAnnotation {
	@SuppressWarnings("unchecked")
	@Test
	public void test01() {
		//(1)获取Class对象
		Class clazz = MyClass.class;//四种方式之一
		
		//(2)获取注解对象
		MyAnnotation annotation = (MyAnnotation) clazz.getAnnotation(MyAnnotation.class);
		
		//(3)获取注解的配置参数的值
		String value = annotation.value();
		System.out.println("value = " + value);
	}
	
	@SuppressWarnings("unchecked")
	@Test
	public void test02() throws NoSuchFieldException, SecurityException {
		//(1)获取Class对象
		Class clazz = MyClass.class;//四种方式之一
		
		//(2)获取属性对象
		Field infoField = clazz.getDeclaredField("info");
		
		//(3)获取注解对象
		MyAnnotation annotation = (MyAnnotation) infoField.getAnnotation(MyAnnotation.class);
		
		//(3)获取注解的配置参数的值
		String value = annotation.value();
		System.out.println("value = " + value);
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值