详解JDK动态代理技术附源代码学习参考

JDK动态代理使用了动态生成字节码技术,通过继承Proxy类,实现了你的业务接口,传入一个InvocationHandler调用处理器,生成一个最终代理类,从而在调用业务方法的时候,实际是调用了InvocationHandler重写的invoke方法,在该方法中你可以加入执行之前之后的逻辑代码,从而为我们在编程中注入强大的魔法。

JDK动态代理生成流程图

JDK动态代理.png

  1. 通过实现 InvocationHandler 接口创建自己的调用处理器;
  //新建一个实现类 
    public class InvocationHandlerImpl implements InvocationHandler {
       //重写invoke方法,三个参数 分别是最终代理,调用方法对象,方法参数
       @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
               System.out.println("在调用之前,处理你的业务逻辑");
           // 调用你的目标方法
               Object returnValue = method.invoke(subject, args);
               System.out.println("在调用之后,处理你的业务逻辑");
       //返回你调用方法的返回值
        return returnValue;
        }
    }
  1. 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
  //代理业务对象
    Subject realSubject = new RealSubject();
   // 方法调用者处理对象,重写了invoke方法
    InvocationHandler handler = new InvocationHandlerImpl(realSubject);
    ClassLoader loader = realSubject.getClass().getClassLoader();
    Class[] interfaces = realSubject.getClass().getInterfaces();
     //该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
    Subject subject = (Subject) Proxy.newProxyInstance(loader, interfaces, handler);
    System.out.println("动态代理对象的类型:" + subject.getClass().getName());
  1. 动态生成的代理类有如下特性:

最终代理类(通过动态生成字节码的形式)继承了Proxy类,实现了代理的接口,由于java不能多继承,这里已经继承了Proxy类了,不能再继承其他的类,所以JDK的动态代理不支持对实现类的代理,只支持接口的代理。

提供了一个使用InvocationHandler作为参数的构造方法。生成静态代码块来初始化接口中方法的Method对象,以及Object类的equals、hashCode、toString方法。重写了Object类的equals、hashCode、toString,它们都只是简单的调用了InvocationHandler的invoke方法,即可以对其进行特殊的操作,也就是说JDK的动态代理还可以代理上述三个方法。

代理类实现代理接口的sayHello方法中,只是简单的调用了InvocationHandler的invoke方法,我们可以在invoke方法中进行一些特殊操作,如执行之前或执行之后处理相应的逻辑操作 ,甚至不调用实现的方法,直接返回。

获取最新源代码方法:
点击链接加入群【JAVA上神交流群】:https://jq.qq.com/?_wv=1027&k=549WcYS

 Java四大引用之硬软弱虚
Kakfa在windows上的启动使用教程 
上一篇:Java四大引用之硬软弱虚
下一篇:Kakfa在windows上的启动使用教程
评论

如果我的文章对你有帮助,或许可以打赏一下呀!

支付宝
微信
QQ