注解-自定义注解-元注解
元注解:就是用于描述注解的注解
@Target:描述注解能够作用的位置
@Retention:苗猪注解被保留的阶段
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承
MyAnno3类
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited public @interface MyAnno3 { }
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 Demo2 { public void show(){ System.out.println("demo2...show2..."); } }
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); }
标签:methodName,String,自定义,show,class,注解,解析,public From: https://www.cnblogs.com/yuzong/p/16726338.html