• 管理
  • JDK的动态代理与cglib动态代理

    JDK的动态代理与cglib动态代理

    两种代理模式:

    • 动态代理:代理类不存在,在程序运行过程中,动态生成代理类和代理类对象,再通过代理对象调用目标对象
    • 静态代理(装饰者模式):代理类是提前创建好的,直接创建代理类对象,再通过代理对象调用目标对象

    一、JDK动态代理

    jdk的动态代理是基于接口的动态代理,要求目标对象必须实现至少一个接口,核心API是java.lang.reflect.Proxy类的newProxyInstance方法。

    Object proxy = Proxy.newProxyInstance(
    					ClassLoader loader,
        				Class[] interfaces,
    					InvocationHandler handler
    				);
    

    返回值:接口的实现类对象

    参数:

    • loader:类加载器对象

    • interfaces:代理对象要实现的接口字节码对象数组,通常写成目标对象.getClass().getInterfaces()

    • handler:代理类的方法里,要执行的操作

      • 通常是增强目标对象的方法或控制目标对象的方法

      • 是InvocationHandler接口的实现类,通常写成匿名内部类形式

        new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //proxy:代理对象的引用,通常不用
                //method:调用的方法对象
                //args:调用的方法的参数
                //result:调用代理对象时的返回值
                return result;
              }
        }
        

    二、cglib动态代理

    cglib的动态代理是基于子类的动态代理,不需要目标对象实现接口,要求被代理类不能由final修饰.核心API是cglib.proxy.Enhancer类的create方法

    Enhancer.create(目标对象.getClass(), new MethodInterceptor() {
                /**
                 * @param proxy:代理对象引用
                 * @param method:目标对象方法(通过它可以访问目标对象)
                 * @param args:传递给目标对象的参数
                 * @MethodProxy methodProxy:代理对象的方法
                 * @return 返回值
                 * @throws Throwable
                 */
       public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                    //功能代码
                    return result;
                }
            });
    

    返回值:目标类的子类对象

    参数:

    • Class:被代理对象的字节码对象,可以创建被代理对象的子类,还可以获取被代理对象的类加载器
    • Callback:增强的代码,通常都是些一个接口的实现类或匿名内部类,我们在使用时一般都是使用Callback接口的子接口:MethodInterceptor
    posted @ 2019-06-07 22:19  故事而已zzz  阅读(721)  评论(0)    收藏  举报