设计模式之代理模式
2018-12-24 本文已影响0人
官先生Y
设计模式之代理模式
10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理
仿JDK实现动态代理逻辑
通过一步步实现一个简易的仿JDK实现动态代理逻辑
第1步:通过动态代理方式模拟实现静态代理效果
- 通过JavaPoet生成静态代理类TimeProxy源代码
- 通过JDK编译TimeProxy源代码
- 通过类加载器把TimeProxy字节码文件转换为内存中TimeProxy字节码对象
- 通过反射机制把创建代理对象
通过第1步实现了:
- 不再需要手动创建TimeProxy类java代码(站在迈向一个完整的动态代理的角度)
- 可以代理任意实现了Flyable接口的类对象,并获取接口方法的执行时间
产生的问题:
- 只是针对实现了Flyable接口的类对象,并不是任意对象
第2步:接口类型作为参数传入,而不是写死
通过第2步实现了:
- 可以针对实现传入接口的任意对象
产生的问题:
- 只能代理特定的功能,缺少灵活性,在这里是只能用于获取方法的执行时间
- 如果要增加其它代理功能,例如在委托方法执行前后打印日志则需要重新创建一个代理类,显然这是不妥的
第3步:新增InvocationHandler接口,用于处理自定义逻辑
开发者需要对代理类进行自定义处理时,只要实现该接口,并在invoke方法中进行相应的处理即可
第4步:修改生成代理对象代码
为此,我们需要在原Proxy.newProxyInstance()方法中做如下改动:
- 在newProxyInstance方法中传入InvocationHandler
- 在生成的代理类中增加成员变量handler
- 在生成的代理类方法中,调用invoke方法
总结
- Proxy->newProxyInstance用于生成代理对象
- InvocationHandler:这个接口主要用于自定义代理逻辑处理
- 为了完成对被代理对象的方法拦截,我们需要在InvocationHandler对象中传入被代理对象实例。