代理模式
代理模式
代理模式是Java的设计模式之一
代理类和委托类有相同接口
代理类负责为委托类预处理消息、过滤消息、转发消息、事后处理消息等
利用代理模式可以实现AOP
按照代理类生成的时期可分为静态代理(编译期生成)和动态代理(运行时动态生成)

静态代理
定义接口或父类,委托类和代理类一起实现相同的接口或继承相同的父类
优点: 可以在不改变委托类源码的情况下,通过代理类来修改委托类的功能 缺点: 接口方法增删时,代理类需要跟着变,不易维护;代理类繁多时不好管理
动态代理
InvocationHandler 接口:提供调用代理操作代理类实现这个接口
Proxy类:动态构建代理类
实现过程
实现
InvocationHandler接口,创建自定义调用处理器获取委托类的
ClassLoader、Interface、InvocationHandlernewProxyInstance传入2中的参数,创建动态代理实例对象通过代理对象调用目标方法
若要查看动态代理生成的类,JDK8之前用
JDK8及之后用
可以在ProxyGenerator#saveGeneratedFiles中查看

运行之后会在当前目录下生成一个com/sun/proxy/$Proxy0
这个类继承了Proxy又实现了委托类的接口
静态代码块中它获取了Object的一些基本方法(equals、toString、hashCode)以及委托类接口的方法(sale)
这些方法的调用都是交给super.h(Proxy#InvocationHandler)调用处理器来处理(重写invoke即可)
动态代理在反序列化中的利用
InvocationHandler的invoke方法,不管外边执行什么方法,都会执行到invoke
目的调用 B.f 入口类 A 接收参数O A中有O.method 但method没有可利用的 若O是动态代理类,且O接收参数B、invoke方法中含有 B.f 则执行O.method时会自动执行 B.f
readObject -> 反序列化时自动执行 invoke -> 函数调用时自动执行
解决Jackson链不稳定问题:https://xz.aliyun.com/t/12846
Last updated
Was this helpful?