程序员社区

基于子类的动态代理(Cglib)

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

文章目录

      • 1.导入依赖
      • 2.Producer类
      • 3.调用处理程序类MyMethodInterceptor
      • 4.测试类Client

基于子类的动态代理:

 涉及的类: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>

2.Producer类

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

    //售后
    public void afterService(float money){
        System.out.println("提供售后服务,并拿到钱"+money);
    }
}

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;
    }
}

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);
    }
}

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

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 基于子类的动态代理(Cglib)

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区