在程序使用(解析)注解:获取注解中定义的属性值,并利用反射来调用方法
步骤1:获取注解定义的位置的对象 (Class,Method,Field)
步骤2:获取指定的注解
步骤3:调用注解中的抽象方法获取配置的属性值
步骤 4.加载该类进内存
步骤5.创建对象
步骤6:获取方法对象
步骤7.执行方法
eg:
注解类proA
/**
* @author KuKaFei.Hai
* @date 2020/4/6 : 15:19
* @Email : 383232084@qq.com
*/
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 注解使用的类名,和该类名下的方法
*/
@Target({ElementType.TYPE,ElementType.METHOD}) //使用于类,和方法上
@Retention(RetentionPolicy.RUNTIME) //给编译器看,所以是RunTime
public @interface ProA {
String className();
String methodName();
}
TestDomeA 类
/**
* @author KuKaFei.Hai
* @date 2020/4/6 : 15:30
* @Email : 383232084@qq.com
*/
public class TestDomeA {
public void show(){
System.out.println("注解,理解真TM难......");
}
}
AnnotationDemo 类(注解的解析类)
package cn.itcsast.Junit;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author KuKaFei.Hai
* @date 2020/4/6 : 15:33
* @Email : 383232084@qq.com
*/
@ProA(className = "cn.itcsast.Junit.TestDomeA",methodName = "show")
public class AnnotationDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
/**
* 根据注解给的参数,获取相应类和该类下的方法
*/
//步骤一 :获取使用了注解类 AnnotationDemo 它的class 文件,目的是要利用反射,在其中找出使用注解 步骤一
Class<AnnotationDemo> annoDemoClass = AnnotationDemo.class;
//步骤二:通过反射创建注解类对象
ProA annoProA = annoDemoClass.getAnnotation(ProA.class);
/**
* 通过反射创建注解类对象实质,就是在内存中生成了一个该注解接口的子类实现对象
* public class annoProA implements ProA{
* public String className(){
* return "cn.itcsast.Junit.TestDemeA";
* }
* public String methodName(){
* return "show";
* }
*
* }
*/
//步骤三:调用注解对象中定义的抽象方法,获取返回值
String className = annoProA.className();
String methodName = annoProA.methodName();
System.out.println(className);
System.out.println(methodName);
//步骤四.加载该类进内存
Class demoClass = Class.forName(className);
//步骤五.创建对象 1.8 getConstructor().newInstance() 取代了newInstance()
Object obj = demoClass.getConstructor().newInstance();
//Object obj = demoClass.newInstance();
// 步骤六.获取方法
Method method = demoClass.getMethod(methodName);
// 步骤七.执行方法
method.invoke(obj);
}
}