java代理
java代理
代理模式
给某一个对象提供一个代理,并由代理对象控制真实对象的访问
代理模式中的角色:
- Subject:接口,定义了被代理的方法
- RealSubject:被代理对象
- Proxy:代理对象
静态代理和动态代理
区别
- 静态代理在代码运行前已经生成代理类的字节码文件,即运行前已经确认代理和被代理对象间的关系;
- 动态代理在代码运行后通过反射动态生成代理类的字节码文件
静态代理
代理对象将被代理对象作为成员对象来进行代理
优点:
- 代码不侵入代理对象
- 简单
缺点:
- 如果一个代理类代理多个目标,代理类的代码会变得非常复杂
- 如果一个代理类代理一个目标,会创建过多代理类
- 修改被代理类的方法时要同时修改代理类
动态代理
动态代理就是根据接口或目标对象,计算出代理类的字节码,然后再加载到JVM中使用
常见动态代理实现方式:
- JDK动态代理
- CGLIB动态代理
JDK动态代理
根据接口创建代理类
用java.lang.reflect.InvocationHandler
定义代理类要执行的操作
用java.lang.reflect.Proxy
创建代理对象
代理对象通过反射获取方法,然后交给InvocationHandler
来执行具体的代理逻辑
CGLIB动态代理
通过继承创建代理类
缺点:
- 需要额外引入CGLIB包
- 只能代理非final的public方法