CGLIB动态代理

要点

  1. 不是jdk自带,需要导入jar包。所需要的jar,cglib-3.0.jar;asm-4.0.jar;asm-util-4.0.jar
  2. 由于jdk动态代理要求,被代理类和代理类要实现同一个接口,当无接口时,就需要使用到cglib动态代理。
  3. 原理是:通过字节码技术为代理类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
  4. cglib的性能高于jdk动态代理,但是cglib创建代理对象时间较长,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适。
  5. 由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

代码示例


package com.kevinlsui.cglib;

public class TestCglib {
    public void say(){
        System.out.println("say...");
    }

    public final void hello(){
        System.out.println("hello...");
    }
}

package com.kevinlsui.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class ProxyCglib implements MethodInterceptor{

    public Object getProxy(Class clazz){
        Enhancer en = new Enhancer();
        en.setSuperclass(clazz);
        en.setCallback(this);
        return en.create();
    }

    @Override
    public Object intercept(Object obj, Method arg1, Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("前置代理");  
        //通过代理类调用父类中的方法  
        Object result = proxy.invokeSuper(obj, args);  
        System.out.println("后置代理");  
        return result; 
    }

}

package com.kevinlsui.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class TestMain {

    //1.所需要的jar,cglib-3.0.jar;asm-4.0.jar;asm-util-4.0.jar
    public static void main(String[] args) {
        //常规写法
        TestCglib cg = (TestCglib) new ProxyCglib().getProxy(TestCglib.class);
        cg.say();//代理成功
        cg.hello();//final方法,代理失败,仅仅执行此final方法

        //其它写法1,不需要ProxyCglib
        final TestCglib t = new TestCglib();
        TestCglib cg2 = (TestCglib) Enhancer.create(TestCglib.class, new MethodInterceptor(){
            @Override
            public Object intercept(Object obj, Method method, Object[] args,
                    MethodProxy proxy) throws Throwable {
                System.out.println("前置。。。");
                Object result = method.invoke(t, args);//此处使用真实业务对象
                System.out.println("后置。。。");
                return result;
            }
        });
        cg2.say();
        cg2.hello();


        //其它写法2,不需要ProxyCglib
        TestCglib cg3 = (TestCglib) Enhancer.create(TestCglib.class, new MethodInterceptor(){
            @Override
            public Object intercept(Object obj, Method method, Object[] args,
                    MethodProxy proxy) throws Throwable {
                System.out.println("前置。。。");
                //Object result = method.invoke(t, args);//此处使用真实业务对象
                Object result = proxy.invokeSuper(obj, args);  
                System.out.println("后置。。。");
                return result;
            }
        });
        cg3.say();
        cg3.hello();

    }


}
文章目录
  1. 1. 要点
  2. 2. 代码示例
|