zoukankan      html  css  js  c++  java
  • 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);
    }
    }


  • 相关阅读:
    QuantLib 金融计算——案例之固息债的关键利率久期(KRD)
    Elasticsearch 最佳运维实践
    Ansible常用的Ansible Module
    中国七夕节( Chinese Valentine's Day)IT的浪漫情结
    Leetcode之C++刷题生死战
    无需Root可自动定时发送微信和短信的黑科技APP,支持跳过开屏启动广告
    tmp
    【整理中】可靠性基础_抽样检测
    【汇总】命名及标识
    Treelist父节点上下移
  • 原文地址:https://www.cnblogs.com/guangxiang/p/13216175.html
Copyright © 2011-2022 走看看