package com.javaWeb03;
import java.lang.reflect.Method;
/**
* 利用注解结合反射模拟写一个框架,不改变代码,可以创建任意对象并调用其方法
*/
/**
* 利用注解代替之前的配置文件,只需要在注解的属性上修改值
*/
@MyAnnoReflect(className = "com.javaWeb03.MyAnnoReflectDemo", method = "show")
public class MyAnnoReflectTest {
public static void main(String[] args) throws Exception {
//获取注解定义的位置上的对象(例如注解定义在:类上的,方法上的,成员变量上的)
Class<MyAnnoReflectTest> myrt = MyAnnoReflectTest.class;
//获取指定的注解getAnnotation,其实就是在内存中生成了一个该注解接口的子类实现对象
/**
* 相当于:
* public class MyAnnoReflectImpl implement MyAnnoReflect{
* public String className(){
* return “com.javaWeb03.MyAnnoReflectDemo”;
* }
* public String method(){
* return "show";
* }
*}
*
*/
MyAnnoReflect an = myrt.getAnnotation(MyAnnoReflect.class);
//获取注解中的抽象方法获取配置的属性值
String className = an.className();
String method = an.method();
//创建一个class对象
Class Cls = Class.forName(className);
//创建一个对象
Object o = Cls.newInstance();
//获取方法
Method clsMethod = Cls.getMethod(method);
//执行方法
clsMethod.invoke(o);
}
}
package com.javaWeb03; public class MyAnnoReflectDemo { public void show(){ System.out.println("show..."); } }
package com.javaWeb03; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME)
//让注解保留到class字节码文件中,并被jvm读取到
public @interface MyAnnoReflect { String className(); String method(); }