Cglib包实现动态代理

  • Post author:
  • Post category:其他


Cglib代理模式基本介绍:

Cglib代理也叫子类代理,它是在内存中构建一个子类对象并对其目标方法进行拦截从而实现对目标对象功能扩展。使用Cglib代理需要引入Cglib jar包,Cglib包的底层是通过字节码处理框架ASM来转换字节码并生成新的类。

1)首先导入cglib jar包

在这里插入图片描述

2)注意,cglib代理的目标对象里要被增强的方法不能是static或者final的,如果是static或者final的则不会被拦截到,因为cglib是通过继承目标类实现方法增强,而static或者final的方法是不能被重写的也就不会执行增强的代码。

还有 cglib代理的目标类更不能是final的,否则会报错,因为不能被继承

在这里插入图片描述

3)cglib代码实现如下:

class TeacherDao {
    public  String teach() {
        System.out.println(" 老师授课中  , 我是cglib代理,不需要实现接口 ");
        return "hello";
    }
}

class ProxyFactory implements MethodInterceptor {
    //维护一个目标对象
    private Object target;
    //构造器,传入一个被代理的对象
    public ProxyFactory(Object target){
        this.target = target;
    }
    //返回一个代理对象:  是 target 对象的代理对象
    public Object getProxyInstance(){
        //1. 创建一个工具类
        Enhancer enhancer = new Enhancer();
        //2. 设置父类
        enhancer.setSuperclass(target.getClass());
        //3. 设置回调函数
        enhancer.setCallback(this);
        //4. 创建子类对象,即代理对象
        return enhancer.create();

    }
    //重写  intercept 方法,会拦截目标对象的方法进行增强
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("Cglib代理模式 ~~ 开始");
        Object invoke = method.invoke(target, objects);
        System.out.println("Cglib代理模式 ~~ 提交");
        return invoke;
    }
}

class Client {

    public static void main(String[] args) {

        //创建目标对象
        TeacherDao target = new TeacherDao();
        //获取到代理对象,并且将目标对象传递给代理对象
        TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance();

        //执行代理对象的方法,触发intecept 方法,从而实现 对目标对象的调用
        String res = proxyInstance.teach();
        System.out.println("res=" + res);
    }

}

output:

在这里插入图片描述

如果们将目标方法改为静态或者final的,输出为:

在这里插入图片描述



版权声明:本文为qq_43365046原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。