*如何解析一个自定义注解?
* 1)在那个类中使用的这个注解,获取该类的字节码文件对象
* 2)通过该类的字节码文件对象加载这个注解
* Class类中:字节码文件对象
* public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
* 获取到了注解对象---->相当于获取到了接口的子实现
* 3)调用该返回的注解(接口)的子实现类对象的属性
* 4)创建Properties属性集合类
* 5)通过反射获取
public class Teacher {
public void love() {
System.out.println("爱java,爱生活");
}
}
@MyPro(className = "com.lin.annotation_04.Teacher",
methodName = "love")
public class Test {
public static void main(String[] args) throws Exception {
// 获取该类Test字节码文件对象
Class<Test> clazz=Test.class;
// 通过该类的字节码文件对象加载这个注解
MyPro myP=clazz.getAnnotation(MyPro.class);
/*
* 相当于:public interface MyPro{
* String className()
* String methodName()
* }
* class MyPropertiesImpl implemnts M
* yProp{
* 重写该抽象方法--->
* }
* */
String className=myP.className();//com.lin.annotation_04.Teacher
String methodName=myP.methodName();//love方法名
// 创建属性集合类对象
Class<?>c=Class.forName(className);
// 直接通过字节码码文件对象获取该类实例
Object obj=c.newInstance();
// 获取Method对象
Method m=c.getMethod(methodName);
// 调用
m.invoke(obj);
}
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)//将@MyPro标记在类上使用
@Retention(RetentionPolicy.RUNTIME)//保留在运行阶段
public @interface MyPro {
// 定义属性--->抽象方法名
String className();
String methodName();
}