简介:
在前面了解到的是通过官方的Proxy类的newProxyInstance()进行代理对象的创建需要接口的参数列表,但是并不是必须强制性从接口进行代理设计,所以就有了CGLIB开发包实现基于类的代理设计。
1、CGLIB是一个第三方的程序包,一般需要单独配置
首先要去下载对应的cglib包:https://nowjava.com/jar/
然后就是进行包的导入:
然后是打开存放包的目录,选中jar文件,点击确定。
然后就是确定再确定,就搞定了,如果没有成功可能是下载的包有问题,重新下载一个或者换一个版本下载试试就行了。
下面是代码操作:
利用CGLIB编写代理类需要一个明确,此时相当于使用了类的形式实现了代理设计处理,所以此代理设计需要通过CGLIB来生成代理对象。
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
class Message {
public void send() {
System.out.println("【发送一个消息】");
}
}
class CLMDProxy implements MethodInterceptor { // 拦截器配置
private Object target; // 保存真实主体对象
public CLMDProxy(Object target){
this.target = target; // 保存真实主体对象
}
public boolean connect() {
System.out.println("【消息代理】发送通道连接成功!");
return true;
}
public void close() {
System.out.println("【消息代理】发送通道连接关闭!");
}
@Override
public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
Object returnData = null;
if (this.connect()){
returnData = method.invoke(this.target, objects); // 调用方法
this.close();
}
return returnData;
}
}
public class MAIN {
public static void main(String[] args) {
Message realObj = new Message(); // 真实主体对象
Enhancer enhancer = new Enhancer(); // 负责代理操作的程序类
enhancer.setSuperclass(realObj.getClass()); // 假定一个父类
enhancer.setCallback(new CLMDProxy(realObj)); // 设置代理类
Message proObj = (Message) enhancer.create(); // 创建代理对象
proObj.send();
}
}
上面的代码是没有问题的,但是会报错,存在配置环境的问题;
因为基于接口的代理设计更加合理,所以这种操作了解就行了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)