java 动态代理原理总结
代理模式(Proxy Pattern)也称委托模式(Delegate Pattern),是一种结构型设计模式,也是一项基础设计技巧;
其中,动态代理有很多有意思的应用场景,比如 AOP、日志框架、全局性异常处理、事务处理等。这篇文章,我们主要讨论最基本的 JDK 动态代理。
从原理上讲,静态代理的代理类 Class 文件在编译期生成,而动态代理的代理类 Class 文件在运行时生成,代理类在 coding 阶段并不存在,代理关系直到运行时才确定。
Proxy.newProxyInstance方法主要流程
- 运行时生成代理类Class对象的字节码,
- 然后加载到jvm虚拟机中,
- 通过反射机制cl.getConstructor(constructorParams)获取到构造方法(传入InvocationHandler),生成实例。
JDK 动态代理的源码,核心类是 Proxy,生成的代理类都继承Proxy,并实现了对应的接口,构造方法中传入InvocationHandler (该参数包含具体的target类实例),调用接口方法时,转发到Invocation#invoke(),调用实际的target实例方法。完成动态代理。
public final class $proxy0 extends Proxy implements HttpApi {
//反射的元数据Method存储起来,避免重复创建
private static Method m1;
private static Method m2;
private static Method m3;
private static Method m0;
public $proxy0(InvocationHandler var1) throws {
super(var1);
}
// 实现了HttpApi接口
public final String get() throws {
try {
//转发到Invocation#invoke()
return (String)super.h.invoke(this, m3, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
}

浙公网安备 33010602011771号