手撕JAVA(三十三)代理

概念

代理:代替处理,又称委托模式。

实现:为目标对象提供(包装)了一个代理,这个代理可以控制对目标对象的访问。外界不直接访问目标对象,而是访问代理对象,再由代理对象调用目标对象。

手撕JAVA(三十三)代理

分类:静态代理、动态代理

静态代理

代理对象持有目标对象的一个句柄,

其实就是将目标对象的引用作为代理对象的成员变量。

缺点:因为要对目标对象的每个方法都进行静态编码包装,所以目标对象中有多少个方法,静态代理对象中就需要有多少个方法。目标对象中方法过多的时候,代理对象就会显的臃肿,也不便于维护和拓展。

代码实现:

手撕JAVA(三十三)代理

动态代理

所谓动态代理其实就是产生一个被处理器全面监听的代理对象出来,这个代理对象的每次方法调用都会被处理器拦截下来。

手撕JAVA(三十三)代理

代码实现:

四要素:接口、实现类(被代理对象)、处理器、代理对象。

接口:​​​​​​

手撕JAVA(三十三)代理

实现类:

手撕JAVA(三十三)代理

处理器:

实现InvocationHandler接口,持有被代理对象。

核心方法——invoke,调用被代理对象的相应目标方法。

手撕JAVA(三十三)代理

测试:

调用Proxy类中的newProxyInstance方法生成代理对象。

传入参数——处理器、实现类类加载器、实现类的父接口。

手撕JAVA(三十三)代理