反射注解
- 要求
- 注解的保留策略必须是RUNTIME
- 反射注解需要从作用目标上返回
- 类上的注解,需要使用Class来获取
- 方法上的注解,需要Method来获取
- 构造器上的注解,需要Construcator来获取
- 成员上的,需要使用Field来获取
Class
Method、Constructor、Field:AccessibleObject
它们都有一个方法:
- Annotation getAnnotation(Class),返回目标上指定类型的注解!
- Annotation[] getAnnotations(),返回目标上所有注解!
代码实践
package cn.itcast.demo2;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
import org.junit.Test;
/**
* 反射注解
* @author WenHuagang
*
*/
public class Demo2 {
@Test
public void fun1() {
/*
* 1.得到作用目标
* 这次反射类上的注解
*/
Class<A> c = A.class;
/*
* 2.获取指定类型的注解
*/
MyAnno1 myAnno1 = c.getAnnotation(MyAnno1.class);
System.out.println(myAnno1.name()+"," +myAnno1.age() + "," + myAnno1.sex());
// A类,100,男
}
@Test
public void fun2() throws SecurityException, NoSuchMethodException {
/*
* 1.获取作用目标
* 这次反射方法上的注解
*/
Class<A> clazz = A.class;
Method method = clazz.getMethod("fun1");
/*
* 2.获取指定类型的注解
*/
MyAnno1 myAnno1 = method.getAnnotation(MyAnno1.class);
System.out.println(myAnno1.name() + "," +myAnno1.age() + "," + myAnno1.sex());
}
}
@MyAnno1(age=100, name="A类", sex="男")
class A {
@MyAnno1(age=666, name="fun1()方法", sex="女")
public void fun1() {
}
}
//一定不要忘记加保留策略(RUNTIME注解加载到JVM中)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno1{
int age();
String name();
String sex();
}