美文网首页
CGLIB动态代理

CGLIB动态代理

作者: xm的那年 | 来源:发表于2019-04-12 23:51 被阅读0次

    CGLIB代理

    JDK动态代理必须提供一些接口才能代理,在一些不能提供的接口环境下,只能采取其他第三方技术,比如CGLIB动态代理,他的优势在于不需要提供接口,只要一个非抽象类就能实现动态代理。

    非抽象类ReflectServiceImpl
    package com.lean.ssm.chapter.cglib;
    
    public class ReflectServiceImpl {
    public void sayHello(String name){
        System.err.println("Hello"+name);
    }
    }
    
    
    cglib代理代码的实现
    public class CglibProxyExample implements MethodInterceptor{
    /**
     * 生成CGLIB代理对象
     * cls -class类
     * Class类的CGLIB对象
     */
        public Object getProxy(Class cls){
    //      CGLIB enhancer增强类对象
            Enhancer enhancer=new Enhancer();
    //      设置增强类型
            enhancer.setSuperclass(cls);
    //      定义代理逻辑对象为当前对象,要求当前对象实现MethodInterceptor方法
            enhancer.setCallback((Callback) this);
    //      生成并返回代理对象
            return enhancer.create();
            
        }
    /**
     * 
     * 代理逻辑对象
     * proxy 代理对象
     * args 方法参数
     * methodProxy 方法代理
     * return 代理逻辑返回
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args,
            MethodProxy methodproxy) throws Throwable {
        // TODO Auto-generated method stub
        System.err.println("调用真实对象前");
    //  CGLIB反射调用真实对象方法
        Object result=methodproxy.invokeSuper(proxy, args);
        System.err.println("调用真实对象后");
        return result;
    }
    public static void main(String[] args) {
        CglibProxyExample cpe=new CglibProxyExample();
        ReflectServiceImpl obj=(ReflectServiceImpl) cpe.getProxy(ReflectServiceImpl.class);
        obj.sayHello("张三");
    }
    
    }
    
    

    这里运用了CGLIB的加强者Enhancer,通过在设置超类的方法(setsuperClass),然后通过setCallback方法设置哪个类为它的代理类,其中,参数为this就意味着当前的对象,那就要求用this这个对象实现接口MethodInterceptor的方法,inteceptor然后返回代理对象。
    那么此时的当前类的inteceptor方法就是其代理逻辑方法,其参数内容见代码注解,我们在反射真实对象的方法前后进行了打印,CGLIB是通过如下代码完成:
    // CGLIB反射调用真实对象方法 Object result=methodproxy.invokeSuper(proxy, args);
    测试一下CGLIB的动态代理

    CglibProxyExample cpe=new CglibProxyExample();
        ReflectServiceImpl obj=(ReflectServiceImpl) cpe.getProxy(ReflectServiceImpl.class);
        obj.sayHello("张三");
    

    相关文章

      网友评论

          本文标题:CGLIB动态代理

          本文链接:https://www.haomeiwen.com/subject/tsjkwqtx.html