• java动态代理实现--基于子类的动态代理


    一、pom中引用

    <!--基于子类的动态代理 -->
    <dependencies>
    <dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.1_3</version>
    </dependency>
    </dependencies>

    二、

    /**
    * 一个生产者
    */
    public class Producer {

    /**
    * 销售
    * @param money
    */
    public void saleProduct(float money){
    System.out.println("销售产品,并拿到钱:"+money);
    }

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


    三、
    /**
    * 模拟一个消费者
    */
    public class Client {

    public static void main(String[] args) {
    final Producer producer = new Producer();

    /**
    * 动态代理:
    * 特点:字节码随用随创建,随用随加载
    * 作用:不修改源码的基础上对方法增强
    * 分类:
    * 基于接口的动态代理
    * 基于子类的动态代理
    * 基于子类的动态代理:
    * 涉及的类:Enhancer
    * 提供者:第三方cglib库
    * 如何创建代理对象:
    * 使用Enhancer类中的create方法
    * 创建代理对象的要求:
    * 被代理类不能是最终类
    * create方法的参数:
    * Class:字节码
    * 它是用于指定被代理对象的字节码。
    *
    * Callback:用于提供增强的代码
    * 它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
    * 此接口的实现类都是谁用谁写。
    * 我们一般写的都是该接口的子接口实现类:MethodInterceptor
    */
    Producer cglibProducer = (Producer)Enhancer.create(producer.getClass(), new MethodInterceptor() {
    /**
    * 执行北地阿里对象的任何方法都会经过该方法
    * @param proxy
    * @param method
    * @param args
    * 以上三个参数和基于接口的动态代理中invoke方法的参数是一样的
    * @param methodProxy :当前执行方法的代理对象
    * @return
    * @throws Throwable
    */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    //提供增强的代码
    Object returnValue = null;

    //1.获取方法执行的参数
    Float money = (Float)args[0];
    //2.判断当前方法是不是销售
    if("saleProduct".equals(method.getName())) {
    returnValue = method.invoke(producer, money*0.8f);
    }
    return returnValue;
    }
    });
    cglibProducer.saleProduct(12000f);
    }
    }


  • 相关阅读:
    css3 transform语法
    自我规范(待增加)
    对于闭包的自我理解
    canvas教程没讲的细节
    react新手教程井字棋游戏
    div自动填满剩余部分(等高布局)
    记录自己以后可能会使用到的想法
    Python__list 常用操作
    Python基础语法(四)-- 函数
    Python基础语法(三)-- 循环
  • 原文地址:https://www.cnblogs.com/guangxiang/p/13216175.html
Copyright © 2020-2023  润新知