CGLIB动态代理

2019-04-12  本文已影响0人  xm的那年

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("张三");
上一篇下一篇

猜你喜欢

热点阅读