package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 我们使用这个注解来实现 和配置文件一样的作用
* 就是把我们需要的信息存储在注解中(配置文件中)
* 这里我们以我们获得一个类的 全限定类名和方法名为例来实现
*/
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassAnno {
String className(); //用来存放类名称
String methodName();
}
package annotation;
import java.lang.reflect.Method;
/**
* 我们把信息放到注解里面
*/
@ClassAnno(className = "domain.Person",methodName = "show" )
public class ReflectTest {
public static void main(String[] args) {
//1.获取自身类的字节码文件
Class reflectTestClass = ReflectTest.class;
//2.获取自己类头上的注解对象 参数是你想获得那个注解的字节码
ClassAnno classAnno = (ClassAnno) reflectTestClass.getAnnotation(ClassAnno.class);
//3.获得想要的value
String className = classAnno.className();
String methodName = classAnno.methodName();
System.out.println(className);
System.out.println(methodName);
try {
//4.根据类名把这个类加载到内存 获得字节码文件
Class personClass = Class.forName(className);
//5.创建类对象
Object obj = personClass.newInstance();
//6.根据方法名获得方法对象
Method method = personClass.getMethod(methodName);
//7.执行方法 需要类对象
method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
}
}