一、jdk动态代理

动态代理分为jdk动态代理和cglib动态代理,本章讲解jdk动态代理

二、jdk动态代理如何实现

  1. 实现InvorcationHander接口,在invoke()方法实现增强
  2. 通过Proxy.newProxyInstance()方法获取到代理类
  3. 调用代理引用调用目标方法实现曾江

三、代码实现

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
final Car car = new BmwCar();
Car carProxy = (Car) Proxy.newProxyInstance(Car.class.getClassLoader(), car.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("增强前");
Object invoke = method.invoke(car, args);
System.out.println("增强后");
return invoke;
}
});
carProxy.run();
}

\

image.png
旧站配图 1 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。

四、实现原理

image.png
旧站配图 2 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。

\

image.png
旧站配图 3 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。

\

image.png
旧站配图 4 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。

\

image.png
旧站配图 5 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。


可以看到通过Proxy.newProxyInstance()生成了目标对象的代理类,以二进制的方式加载到了内存中.
那么代理类长什么样子呢?\

image.png
旧站配图 6 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。
  1. 代理类继承了Proxy类并且实现了我们的car接口
  2. 在实现的run方法中,调用了h.invoke()方法
  3. 那么h是什么呢? h是 Proxy类中的属性,就是InvoketionHander接口的引用,所以jdk代理类必须实现InvoketionHander接口\
    image.png
    旧站配图 7 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。

    jdk 动态代理实现图\
    image.png
    旧站配图 8 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。