代理模式,在客户端和目标之间起到代理的作用,一是对被代理对象的保护,二是对被代理对象的增强。
Subject 是顶层接口,RealSubject 是真实对象(被代理对象),Proxy 是代理对象,代理对象持有被代理对象的引用,客户端调用代理对象方法,同时也调用被代理对象的方法,但是在代理对象前后增加一些处理。在代码中,我们想到代理,就会理解为是代码增强,其实就是在原本逻辑前后增加一些逻辑,而调用者无感知。代理模式属于结构型模式,有静态代理和动态代理。
JDK Proxy生成对象的步骤:
1.获取被代理对象的引用,反射获取所有的接口
2.生成一个新的类,同时实现所有接口
3.动态生成java代码,新加的业务逻辑到原有接口中
4.编译生成java代码.class
5.在到jvm中运行
Proxy生成代理实例的方法
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
这个方法的作用就是创建一个代理类对象,它接收三个参数,我们来看下几个参数的含义:
loader:一个classloader对象,定义了由哪个classloader对象对生成的代理类进行加载
interfaces:一个interface对象数组,表示我们将要给我们的代理对象提供一组什么样的接口,如果我们提供了这样一个接口对象数组,那么也就是声明了代理类实现了这些接口,代理类就可以调用接口中声明的所有方法。
h:一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由其调用。
这里返回一个代理对象实例。代理类里有被代理类的所有方法,调用时怎么增强被代理类呢?
每一个动态代理类的调用处理程序(在这个调用处理程序里生成代理类)都必须实现InvocationHandler接口,并且每个代理类的实例都关联到了实现该接口的动态代理类调用处理程序中,当我们通过动态代理对象调用一个方法时候,这个方法的调用就会被转发到实现InvocationHandler接口类的invoke方法来调用,
/**
* proxy:代理类代理的真实代理对象com.sun.proxy.$Proxy0
* method:我们所要调用某个对象真实的方法的Method对象
* args:指代代理对象方法传递的参数
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
让我们来看看生成的代理类里的方法
代理类的执行方法里执行的是 调用程序的 invoke()方法
具体例子可以看这篇博客
https://blog.csdn.net/yaomingyang/article/details/80981004#commentsedit