473自定义注解_元注解和474注解解析
注解-自定义注解-元注解
元注解:就是用于描述注解的注解
@Target:描述注解能够作用的位置
@Retention:苗猪注解被保留的阶段
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承
MyAnno3类
@MyAnno(value = 1, strd = "abc", anno2 = @MyAnno2, per = Person.p1)
@MyAnno3
public class Worker {
@MyAnno3
public String name = "aaa";
@MyAnno3
public void show(){
}
}
Worker类
@MyAnno(value = 1, strd = "abc", anno2 = @MyAnno2, per = Person.p1)
@MyAnno3
public class Worker {
@MyAnno3
public String name = "aaa";
@MyAnno3
public void show(){
}
}
注解-解析注解
在程序是用哪个(解析)注解:获取注解中定义的属性值
1.获取注解定义的位置的对象
2.获取指定的注解
3.调用注解中的抽象方法获取配置的属性值
Pro注解
/*
描述需要执行的类名,和方法名
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
String ClassName();
String methodName();
}
Demo1类和Demo2类
public class Demo1 {
public void show(){
System.out.println("demo...show...");
}
}
public class Demo1 {
public void show(){
System.out.println("demo...show...");
}
}
ReflectTest类
@Pro(ClassName ="cn.itcast.annotation.Demo1",methodName = "show")
public class ReflectTest {
/*
前提:不能改变该类的任何代码,可以创建任意类的对象,可以执行任意方法
*/
public static void main(String[] args) throws Exception {
//1.解析注解
//1.1获取该类的字节码文件对象
Class<ReflectTest> reflectTestClass = ReflectTest.class;
//2.获取上边的注解对象
//其实就是在内存中生成了一个该注解接口的子类实现对象
/*
public class ProImpl implements Pro(){
public String className(){
return "cn.itcast.annotation.Demo1";
}
public String methodName(){
return "show";
}
}
*/
Pro annotation = reflectTestClass.getAnnotation(Pro.class);
//3.调用注解对象中定义的抽象方法,获取返回值
String className = annotation.ClassName();
String methodName = annotation.methodName();
System.out.println(className);
System.out.println(methodName);
//3.加载该类进内存
Class cla = Class.forName(className);
//4.创建对象
Object o = cla.newInstance();
//5.获取方法对象
Method method = cla.getMethod(methodName);
//6.执行方法
method.invoke(o);
}

浙公网安备 33010602011771号