JAVA代理模式之三动态代理CGLIB详解

我们在上一篇中使用jdk实现的动态代理。但是大家有没有发现使用jdk生成代理对象时有弊端,什么样的弊端呢?
如果我的委托类没有实现接口,能使用jdk的动态代理吗?
看过源码的都知道当然是不行的。那怎么办?
我们可以使用cglib生成动态代理
cglib:Code Generation Library是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口.
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.
使用步骤:
1、创建委托类
2、创建代理的生成工具类
1、实现接口,MethodInterceptor
2、声明代理对象并实例化
3、创建生成代理对象的方法
4、重写接口中的拦截方法
3、测试
委托类:

public class Examinee {

    private String name;//姓名
    //考试
    public void exam() {
        System.out.println(name+",正在考试……");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

代理类的生成工具类:

//1、创建类实现接口
public class CglibProxyFactory implements MethodInterceptor {
    //2、声明委托类对象并完成实例化
    private Object target;//目标类对象
    //通过构造方法完成注入
    public CglibProxyFactory(Object obj){
        target=obj;
    }
    //3、创建代理类对象
    public Object createProxy() {
        //创建代理类的核心类对象
        Enhancer enhancer=new Enhancer();
        //设置父类
        enhancer.setSuperclass(target.getClass());
        //设置回调函数
        enhancer.setCallback(this);
        //获取代理对象
        return enhancer.create();   
    }
    //4、拦截方法处理:回调函数
    /**
     * 参数说明
     * 1、生成的代理类对象
     * 2、要执行的方法对象
     * 3、实际参数对象
     * 4、要执行的方法的代理对象*/
    @Override
    public Object intercept(Object proxy, Method method, Object[] arg0, MethodProxy methodProxy) throws Throwable { 
        System.out.println("抢手进场,代替");
        //这样写也可以
        Object res=method.invoke(target, arg0);//执行真正的方法
        //这样写也可以
        //Object res=methodProxy.invokeSuper(proxy, arg0);

        return res;
    }

}

CGLIB的实现就是让代理类直接继承我们的委托类,所以无论委托类有没有接口的实现都是无所谓的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值