aop的实现原理: 动态代理机制-->反射
一、反射- reflect
-
什么是反射
1. mybatis的动态sql 反射是指在运行期执行一些操作(加载类对象,创建对象,调用方法...)
-
api方法
-
Class类
-
获取类方法
获取类中的成员变量/属性 getDeclaredFields():Field[] 获取类中的方法 getDeclaredMethods(): Method[] 获取方法的名称 Method类中: getName()
-
-
执行类方法
1. 根据类名加载类对象 Class.forName(类名) -- Class 2. 创建对象 Class类中: newInstance() 3. 运行期,让方法执行: Method类中: invoke(Object target,Object...args):Object
注意点: 反射可以访问私有成员,但是需要先放开权限,通过调用方法放开: setAccessable(true)
-
案例: 在运行期,用户输入一个类名,创建该类的对象,调用类中所有以test开头的方法.
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException { System.out.println("请输入类名:"); Scanner scanner = new Scanner(System.in); String className = scanner.nextLine(); //根据类名加载得到Class对象 Class cls = Class.forName(className); //创建该类的实例 Object target = cls.newInstance(); //调用所有以test开头的方法 Method[] methods = cls.getDeclaredMethods(); for (Method method:methods) { if(method.getName().startsWith("test")){ Object returnVal = method.invoke(target); System.out.println(method.getName()+"的返回值为:"+returnVal); } } }
后边真正的动态代理需要等以后补充