一、jdk动态代理
动态代理分为jdk动态代理和cglib动态代理,本章讲解jdk动态代理
二、jdk动态代理如何实现
- 实现InvorcationHander接口,在invoke()方法实现增强
- 通过Proxy.newProxyInstance()方法获取到代理类
- 调用代理引用调用目标方法实现曾江
三、代码实现
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(); }
|
\
旧站配图 1 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。
四、实现原理
旧站配图 2 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。
\
旧站配图 3 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。
\
旧站配图 4 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。
\
旧站配图 5 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。
可以看到通过Proxy.newProxyInstance()生成了目标对象的代理类,以二进制的方式加载到了内存中.
那么代理类长什么样子呢?\
旧站配图 6 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。
- 代理类继承了Proxy类并且实现了我们的car接口
- 在实现的run方法中,调用了h.invoke()方法
- 那么h是什么呢? h是 Proxy类中的属性,就是InvoketionHander接口的引用,所以jdk代理类必须实现InvoketionHander接口\
旧站配图 7 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。
jdk 动态代理实现图\
旧站配图 8 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。