代理模式之 cglib

Posted 我想月薪过万

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式之 cglib相关的知识,希望对你有一定的参考价值。

在 玩转JAVA代理模式 一文中,我们介绍了代理模式的基本概念 和 使用 jdk 实现步骤。这一篇文章我将带大家来使用 cglib 实现动态代理。

cglib 是第三方提供的包,所以需要引入jar包坐标:Project Structure…->Libraries->+For Maven->输入:cglib:cglib:3.2.2下载结束后可以使用

出现警告是因为版本过高,使用cglib:cglib:2.2.2或以下即可。

我们都知道,使用 jdk 实现动态代理的时候我们是有条件的,那就是这个代理目标得有接口。 然而,cglib 就很好的解决了这个问题,它可以代理没有接口的类,这样就弥补了 JDK 的不足。

 代码演示

张三 类

package cglibProxy;

/**
 * ClassName: ZhangSan <br/>
 * Description: <br/>
 * date: 2021/7/10 14:54<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class ZhangSan {
    public void findBeauty(){
        System.out.println("相亲要求:皮肤白,大长腿");
    }
}

媒婆代理 类

package cglibProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * ClassName: MeiPo <br/>
 * Description: <br/>
 * date: 2021/7/10 14:56<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class cglibMeiPo implements MethodInterceptor {

    //第一步:获取实例
    public Object getInstance(Class<?> clazz){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();// .create() 不要忘记了,要不然会报错,类型转换失败
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //第二步:调用方法,o代表父类,objects代表参数,methodProxy代表代理方法
        methodProxy.invokeSuper(o,objects);
        return null;
    }
}

测试 类

package cglibProxy;

/**
 * ClassName: test <br/>
 * Description: <br/>
 * date: 2021/7/10 15:34<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class test {
    public static void main(String[] args) {
        cglibMeiPo cglibMeiPo = new cglibMeiPo();
        ZhangSan instance = (ZhangSan) cglibMeiPo.getInstance(ZhangSan.class);
        instance.findBeauty();
    }
}

效果展示

 从上面的代码中我们可以看到,cglib 的代理并不需要接口。

原理对比

jdk代理:需要接口,是对接口的继承,这就导致了代理对象只能调用接口中存在的方法。

cglib代理:给一个类 Class 即可,是对类的继承,继承其所有方法来产生子类,好处就是代理对象能够调用这个 Class 的所有方法。

以上是关于代理模式之 cglib的主要内容,如果未能解决你的问题,请参考以下文章

Java动态代理之JDK实现和CGlib实现

系统架构设计——设计模式之代理模式CGLIB动态代理实现

代理模式与动态代理之JDK实现和CGlib实现

设计模式之代理模式详解和应用

基础篇——代理模式之SpringAOP

设计模式之动态代理模式实战