Spring 之 Cglib (動態代理)

Spring 之 Cglib (動態代理)

Cglib 的FastClass 會比一般的java的動態代理快很多。下面代碼中有簡單的說明

/**
 * @ClassName TargetPojo
 * @Author 莫邪
 * @Description TODO
 * @Date Created in 0:17 2020/4/8
 * @Version 1.0
 */
//被代理的類
public class TargetPojo {

    public void pojoMethod(){
        System.out.println("TargetPojo pojoMethod run");
    }
}
/**
 * @ClassName DefaultMethodInterceptor
 * @Author 莫邪
 * @Description TODO
 * @Date Created in 0:38 2020/4/8
 * @Version 1.0
 */
//默認的代理方法實現接口,cglib 定義被代理後會執行的接口方法
public class DefaultMethodInterceptor implements MethodInterceptor {
    private Object target;//被代理對象
    public DefaultMethodInterceptor(Object target){
        this.target =target;
    }
    @Override
    public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println(proxy.getClass());//生成的代理類
        System.out.println(methodProxy.getSuperName());
        before(method);
//        Object res = method.invoke(target, objects);
        Object res = methodProxy.invokeSuper(proxy,objects);//直接執行父類的方法不走反射 FastClas優化 爲代理類和被代理類都生成來了一個,要執行的方法直接通過索引下標去導航(耗內存,但是快)
        return res;
    }

    private void before(Method method){
        System.out.println("before method:" + method.getName());
    }
}

/**
 * @ClassName CglibUtil
 * @Author 莫邪
 * @Description TODO
 * @Date Created in 0:22 2020/4/8
 * @Version 1.0
 */
//Cglib 代理工具類
public class CglibUtil {

    public static  <E>E getCglibProxy(E target, MethodInterceptor methodInterceptor){
//        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\class");//輸出生成的代理類,可以用於分析
        if(methodInterceptor==null){
            methodInterceptor= new DefaultMethodInterceptor(target);
        }
        E o =(E) Enhancer.create(target.getClass(), methodInterceptor);
        return o;

    }

}

/**
 * @ClassName CglibEg1
 * @Author 莫邪
 * @Description TODO
 * @Date Created in 0:18 2020/4/8
 * @Version 1.0
 */
//cglib使用案例
public class CglibEg1 {
    public static void main(String[] args) {

        TargetPojo proxy = CglibUtil.getCglibProxy(new TargetPojo(), null);
        proxy.pojoMethod();
        System.out.println("打印生成的代理類");
        Method[] methods = proxy.getClass().getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章