Java有三种代理模式:静态代理、动态代理和cglib代理。代理模式是一种设计模式 , 提供了对目标对象额外的访问方式 , 即通过代理对象访问目标对象.举个例子 , 存在一个 对象A , 但是开
-
-
- 只编写一个代理类 , 每代理一个委托类就多实现一个接口 , 但这样会导致代理类过于庞大 .
- 为每个委托类都编写一个代理类 , 但这样会导致代理类数量过多.
package Proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class test { public static void main(String args[]){ //创建目标类的实例化对象 testDelegate delegate = new testDelegate(); //获取delegate的classloader ClassLoader classLoader = delegate.getClass().getClassLoader(); //获取delegate对象实现的接口 Class[] interfaces = delegate.getClass().getInterfaces(); //通过代理类testHandler传入delegate对象来创建一个调用处理器 InvocationHandler invocationHandler = new testHandlder(delegate); //创建代理对象proxy testInterface proxy = (testInterface) Proxy.newProxyInstance(classLoader,interfaces,invocationHandler); proxy.say(); } }
运行结果: 总的来说分为三步: 1.实现 java.lang.reflect.InvocationHandler接口来创建自定义的调用处理器 (InvocationHandler) 2.为 java.lang.reflect.Proxy类指定ClassLoader,Interfaces和InvocaHandler 3.调用 java.lang.reflect.Proxy.newProxyInstance()方法,分别传入2中的三个参数 最后创建出代理对象proxy。 注意看动态代理的代理类不需要调用目标类的方法来实现对与目标类的扩展了, 而是通过实现InvocationHandler来对于目标类testDelegate的扩展,这是和静态代理不一样的 也能比静态代理更好的通用和方便。 来调试一下 首先是创建委托类的实例化对象 然后是classloader和interfaces的获取 然后传入delegate对象去获取invocationhadler 这里重写的invoke()方法用Object去修饰,就可以返回任意类型的类对象object 也是可以用class<?>泛型来修饰,不过需要用户传入对象类型,用object就修饰就可以了 接着再调用Proxy.newProxyInstance()方法生成动态代理对象 最后就是调用say方法,输出自定义的东西,然后去invoke目标类的方法 参考:https://www.guildhab.top/2020/07/java-%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E5-%E8%A7%A3%E5%AF%86-ysoserial-java%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E6%9C%BA%E5%88%B6/