Java Dynamic Proxy
前言
复习一下Java动态代理。
正文
为啥要用动态代理?
我觉得我们不能从What开始学,直接学啥是动态代理直接能直接给人看懵逼。
我们从Why的角度开始学,为什么需要动态代理?
动态代理其实就是一个动态生成子类的方法,看起来写出来一堆东西,但是针对Java这个静态语言,却是非常有用的。
试想,你有一个大的Java项目,现在你想改动一个类中的某个方法,如果不使用动态代理的方式,那你就会面临一个困境–你需要把源文件修改了,然后再拿去编译、运行,甚至有些地方引用了这个方法但不希望更改也需要重新设一个再改回去。
但是如果你使用了动态代理,这个方法就是动态生成的,你就直接可以在不重新编译的情况下直接更改类中的方法然后应用到当前模块中,这对于整个项目来说效率都是非常高的,而且可变性可延展性都非常强大。配合反射的时候,往往你只需要更改一下类的输入或者配置文件就能一步到位。
这里可以举一个例子来说明动态代理的实现:
就好比你建了一栋房子,但是你需要把你最底下的某个砖头换了,如果没用动态代理,你就必须把你的房子掀了再去找到这个砖头然后更换。但使用了动态代理后,就相当于它能自动帮你生成符合你需求的完美砖头并应用成功,根本就不需要你掀了整个房子。
这里直接引入Proxy。
Proxy 是设计模式中的一种。当需要在已存在的 class 上添加或修改功能时,可以通过创建 proxy object 来实现
通常 proxy object 和被代理对象拥有相同的方法,并且拥有被代理对象的引用,可以调用其方法。
代理模式应用场景包括
- 在方法执行前后打印和记录日志
- 认证、参数检查
- lazy instantiation (Hibernate, Mybatis)
- AOP (transaction)
- mocking
- …
代理有两种实现方式
- 静态代理:在编译时期,创建代理对象
- 动态代理:在运行时期,动态创建
对于重复性工作,如打印日志,静态代理需要为每个 class 都创建 proxy class,过程繁琐和低效,而动态代理通过使用反射在运行时生成 bytecode 的方式来实现,更加方便和强大
后续可看Java Dynamic Proxy | b1ngz,总结的很不错,我就不再赘述了。