当前位置:   article > 正文

基于子类的动态代理(Cglib)_动态代理 cglib 为什么是基于子类的‘

动态代理 cglib 为什么是基于子类的‘

在上一篇博客中写了基于接口的动态代理,其实这两个原理基本差不多,对比学习更好理解。


基于子类的动态代理:
 涉及的类:Enhancer
 提供者:第三方库cglib库
 如何创建代理对象:使用Enhancer类中的create方法
 创建代理对象的要求:代理类不是最终类

1.导入依赖

 <dependencies>
        <!-- https://mvnrepository.com/artifact/cglib/cglib -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.7</version>
        </dependency>
    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.Producer类

//生产者
public class Producer{
    //销售
    public void saleProduce(float money){
        System.out.println("销售商品,并拿到钱"+money);
    }

    //售后
    public void afterService(float money){
        System.out.println("提供售后服务,并拿到钱"+money);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.调用处理程序类MyMethodInterceptor

public class MyMethodInterceptor implements MethodInterceptor {
    private Object target;
    public MyMethodInterceptor(Object target) {
        this.target = target;
    }
    public Object intercept(Object o, Method method,
                            Object[] args, MethodProxy methodProxy) throws Throwable {
        Object result = null;
        //获取方法执行的参数
        Float money = (Float)args[0];
        //判断当前方法是不是销售
        if("saleProduce".equals(method.getName())){
            result = method.invoke(target, money*0.8f);
        }
        return result;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

4.测试类Client

public class Client {
    public static void main(String[] args) {

        //被代理对象
        Producer producer = new Producer();

        //获取代理对象
        Producer proxy =(Producer) Enhancer.create(
                producer.getClass(),
                new MyMethodInterceptor(producer));

        //使用代理对象调用被代理对象中的方法
        proxy.saleProduce(10000f);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/907953
推荐阅读
相关标签
  

闽ICP备14008679号