直观理解JAVA动态代理

动态代理:

概念:

依赖被代理对象B的字节码信息,创建代理对象A,用户对B的任意方法访问必须经过A的处理。该方法实现了用户与B类的隔离,在不修改源码的基础上(无侵入式的代码扩展),对被代理对象的方法进行增强。

简单点说就是,你作为大臣递给皇上的奏章,都被慈禧(代理对象)先看一遍并批改一下,才能给真正的皇上看(被代理对象)。

实现方法分类:

  • 基于接口的动态代理

    依赖类:Proxy(JDK官方)

    使用条件:被代理对象B至少实现一个接口,否则不能使用

    使用方法:使用Proxy类中的newProxyInstance方法,根据B类字节码创建代理类A;

    newProxyInstance方法的参数

    • ClassLoader:用于加载被代理对象字节码中的类加载器,固定写法,xx.getClass().getClassLoader();
    • Class[]:字节码数组,用于让代理对象和被代理对象有相同的方法,固定写法,xx.getClass().getInterfaces();
    • InvocationHandler:用于提供增强的代码,匿名内部类InvocationHandler,覆写invoke()(这个函数就是下图中的红色菱形);

    便于理解的示意图:

在这里插入图片描述
在这里插入图片描述

  • 基于子类的动态代理

    依赖类:Enhancer(cglib第三方库)

    使用条件:被代理对象B不能是final

    使用方法:使用Enhancer类中的create方法,根据B类字节码创建代理类A

    create方法的参数

  • Class:被代理类B的字节码,固定写法,xx.getClass();

  • Callback:用于提供增强的代码,使用匿名类MethodInterceptor,覆写intercept()方法

原理图同上。

猜你喜欢

转载自blog.csdn.net/weixin_40106401/article/details/106147631