转载自https://github.com/Snailclimb/JavaGuide (添加小部分笔记)感谢作者!
何为反射#
赋予了我们在运行时分析类以及执行类中方法的能力;运行中获取任意一个类的所有属性和方法,以及调用这些方法和属性
应用场景#
Spring/Spring Boot 、MyBatis等框架都用了大量反射机制,以下为
JDK动态代理
接口及实现类
package proxy; public interface Car { public void run(); } //实现类 package proxy; public class CarImpl implements Car{ public void run() { System.out.println("car running"); } }代理类 及main方法使用
[ˌɪnvəˈkeɪʃn] 祈祷package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //JDK动态代理代理类 public class CarHandler implements InvocationHandler{ //真实类的对象 private Object car; //构造方法赋值给真实的类 public CarHandler(Object obj){ this.car = obj; } //代理类执行方法时,调用的是这个方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"); Object res = method.invoke(car, args); System.out.println("after"); return res; } } //main方法使用 package proxy; import java.lang.reflect.Proxy; public class main { public static void main(String[] args) { CarImpl carImpl = new CarImpl(); CarHandler carHandler = new CarHandler(carImpl); Car proxy = (Car)Proxy.newProxyInstance( main.class.getClassLoader(), //第一个参数,获取ClassLoader carImpl.getClass().getInterfaces(), //第二个参数,获取被代理类的接口 carHandler);//第三个参数,一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上 proxy.run(); } } //输出 before car running after
Cglib动态代理(没有实现接口的Car










