美文网首页
CGlib动态代理

CGlib动态代理

作者: YNZXGWZM | 来源:发表于2018-10-18 19:22 被阅读0次

    用了这个DynamicProxy以后,还是非常好的,好的地方是接口变了,这个动态代理类不用动。而静态代理就不一样了,接口变了,代理类也要动。但动态代理并不是万灵丹,它也有搞不定的时候,比如要代理一个没有任何接口的类,它就没有用武之地了。这个时候就只能使用CGlib这个类库。在spring和hibernate中都有使用CGlib实现动态代理。它是在一个运行期间动态生成字节码的工具,也就是动态生成代理类了,下面使用CGlib实现动态代理,写一个CGLibProxy:

    package org.smart4j.framework.test;
    
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * Created by jack on 2017/6/27.
     * 使用CGlib实现动态代理
     */
    public class CGLibProxy implements MethodInterceptor{
    
        private static CGLibProxy instance = new CGLibProxy();
        public CGLibProxy() {
        }
    
        public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
            before();
            Object result = methodProxy.invokeSuper(object,args);
            after();
            return result;
        }
    
        private void before(){
            System.out.println("Before");
        }
        private void after(){
            System.out.println("After");
        }
    
        public <T> T getProxy(Class<T> cls){
            return (T) Enhancer.create(cls,this);
        }
    
        public static CGLibProxy getInstance(){
            return instance;
        }
    }
    
    
    package org.smart4j.framework.test;
     
    /**
     * Created by jack on 2017/6/27.
     * CGlib动态代理测试
     *
     */
    public class MainTest2 {
        public static void main(String[] args) {
          Hello helloProxy = CGLibProxy.getInstance().getProxy(HelloImp.class);
            CGLibProxy.getInstance().getProxy(HelloImp.class).sayHello("jack");
          helloProxy.sayHello("jack");
        }
    }
    
    

    相关文章

      网友评论

          本文标题:CGlib动态代理

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