CGLIB动态代理

今天来看看CGLIB动态代理的实现

  • 个人感觉CGLIB的动态代理比JDK动态代理要简单一点
  • jdk动态代理要求被代理的类是实现接口的,即jdk动态代理的前提是你代理的类有实现接口,但是很多情况下类不一定会实现有接口,甚至接口中的方法也不一定是你想代理的。这时候就需要一种可以直接基于类的动态代理方式,cglib就是这样一种基于类的动态代理方式。

先说注意事项:一开始我在jdk17上使用这个cglib动态代理,一直报错,怀疑是pom.xml导包的问题然后搞了好一阵子还是报错,于是我决定使用jdk1.8来进行实验。朋友们,这里是jdk1.8哈!当然如果知道在jdk17怎么使用这个cglib的话十分欢迎留言,教教孩子吧!

下面正式开始

  1. 先导入cglib的依赖
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.7</version>
        </dependency>
  1. 下面给大伙看看我的目录结构
    • zmain是最终测试的,里面就一个main方法
    • origin_class是原来的类,就是需要被代理的类
    • cglibProxy是对被代理类的方法的代理增强,换言之,这个就是动态代理的关键
      在这里插入图片描述
  2. origin_class类
public class origin_Class {
    public void sayHello(){
        System.out.println("this is origin");
    }

    public void sayGood(){
        System.out.println("this is good");
    }
}
  • 可以看到这里就是定义了两个方法哈
  1. 接下来是关键的cglib动态代理过程,实现MethodInterceptor接口
public class cglibProxy implements MethodInterceptor {


    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        String name = method.getName();
        System.out.println("the method name is "+name);
        return methodProxy.invokeSuper(o,objects);
    }
}
  • 重写里面的intercept方法,方法原来的调用使用MethodProxy.invokeSuper()实现,和jdk动态代理那里类似
  • 我这里做的增强工作是把每个方法的方法名打印出来
  1. 创建动态代理实例
public class zmain {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(origin_Class.class);
        enhancer.setCallback(new cglibProxy());
        origin_Class ans = (origin_Class)enhancer.create();
        ans.sayGood();
        ans.sayHello();

    }
}
  • 这个过程十分简单,就是创建一个enhancer实力,然后通过setSuperclass设置被代理的类的class对象,然后通过setCallback来设置代理对象,即实现了MethodInterceptor接口的类。
  1. 打印输出结果看看
the method name is sayGood
this is good
the method name is sayHello
this is origin

进程已结束,退出代码为 0
  • 可以看到cglib动态代理功能已经实现

重要的事情反复说,这里是基于jdk1.8实现。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值