代理模式之 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的主要内容,如果未能解决你的问题,请参考以下文章