cglib实现动态代理

一、jdk动态代理的问题

使用jdk动态代理存在一个问题,jdk提供的动态代理只能为拥有接口的类进行动态代理,但是对于没有实现接口的类,则没有办法进行动态代理。

二、什么是cglib动态代理

cglib是是第三方的工具库。其原理是继承,cglib通过继承目标类,创建他的子类,在子类当中重写父类的相关方法,实现功能的增强。

三、cglib基本结构

下图所示,代理类去继承目标类,每次调用代理类的方法都会被方法拦截器拦截,在拦截器中才是调用目标类的该方法的逻辑。

四、cglib实现动态代理的原理

1.生成一个空的字节码对象
2.通过字节码对象生成目标类对象的子类 进行增强
3.实现拦截器,通过连接器实现代理的类方法
4.创建代理对象

五、代码实现

CGLib动态代理中提供了一个类Enhance,需要用它生成一个空的字节码对象,所以我们需要导入外部的jar包依赖
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2.2</version>
</dependency>

1.目标类

/**
 * 目标类
 */
public class ClothesFactory {
    public void clothes(String size) {
        System.out.println("已经为您制作好了一整套size为"+size+"的衣服。。。。。。。。");
    }
}

2.拦截器


/**
 * 实现拦截器,通过连接器实现代理的类方法
 */
public class MyMethodInterceptor implements MethodInterceptor {
    /**
     *
     * @param o   代理对象
     * @param method 目标对象中的方法
     * @param objects 目标对象中方法的参数
     * @param methodProxy 代理对象中代理方法对象
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("前置增强");
        methodProxy.invokeSuper(o,objects);  // 动态的回调父类当中的方法
        System.out.println("后置增强");
        return o;
    }
}

3.代理类

/**
 * 代理类
 */
public class CglibProxy  {
    
    public static Object createProxy(String path) throws ClassNotFoundException {
        Enhancer enhancer = new Enhancer();  //生成空的字节码对象
        enhancer.setSuperclass(Class.forName(path)); //通过字节码对象生成目标类对象的子类 进行增强
        enhancer.setCallback(new MyMethodInterceptor()); //实现拦截器,通过连接器实现代理的类方法
        Object o = enhancer.create();//创建代理对象
        return o;
    }
}

4.测试

public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        //生成代理对象
        ClothesFactory proxy = (ClothesFactory) CglibProxy.createProxy("com.qcby.ClothesFactory");
        //方法调用
        proxy.clothes("xxxL");
    }
}
 
 
 
posted @   风筝上的猫  阅读(119)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示