随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

简介:

在前面了解到的是通过官方的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();
    }
}

上面的代码是没有问题的,但是会报错,存在配置环境的问题;

因为基于接口的代理设计更加合理,所以这种操作了解就行了。

 

posted on 2022-03-07 12:06  时间完全不够用啊  阅读(173)  评论(0编辑  收藏  举报