• java动态代理实现--基于接口的动态代理


    一、
    /**
    * 一个生产者
    */
    public class Producer implements IProducer{

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

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


    二、
    /**
    * 对生产厂家要求的接口
    */
    public interface IProducer {

    /**
    * 销售
    * @param money
    */
    public void saleProduct(float money);

    /**
    * 售后
    * @param money
    */
    public void afterService(float money);
    }

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

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

    /**
    * 动态代理:
    * 特点:字节码随用随创建,随用随加载
    * 作用:不修改源码的基础上对方法增强
    * 分类:
    * 基于接口的动态代理
    * 基于子类的动态代理
    * 基于接口的动态代理:
    * 涉及的类:Proxy
    * 提供者:JDK官方
    * 如何创建代理对象:
    * 使用Proxy类中的newProxyInstance方法
    * 创建代理对象的要求:
    * 被代理类最少实现一个接口,如果没有则不能使用
    * newProxyInstance方法的参数:
    * ClassLoader:类加载器
    * 它是用于加载代理对象字节码的。和被代理对象使用相同的类加载器。固定写法。
    * Class[]:字节码数组
    * 它是用于让代理对象和被代理对象有相同方法。固定写法。
    * InvocationHandler:用于提供增强的代码
    * 它是让我们写如何代理。我们一般都是些一个该接口的实现类,通常情况下都是匿名内部类,但不是必须的。
    * 此接口的实现类都是谁用谁写。
    */
    IProducer proxyProducer = (IProducer) Proxy.newProxyInstance(producer.getClass().getClassLoader(),
    producer.getClass().getInterfaces(),
    new InvocationHandler() {
    /**
    * 作用:执行被代理对象的任何接口方法都会经过该方法
    * 方法参数的含义
    * @param proxy 代理对象的引用
    * @param method 当前执行的方法
    * @param args 当前执行方法所需的参数
    * @return 和被代理对象方法有相同的返回值
    * @throws Throwable
    */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) 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;
    }
    });
    proxyProducer.saleProduct(10000f);
    }
    }
  • 相关阅读:
    Sentry异常捕获平台
    docker部署RabbitMQ(单机)
    Elasticsearch参数调优
    docker 部署Elasticsearch-权限认证(单节点)
    ElementUI 实现el-table 列宽自适应
    vue 弹幕插件
    linux 命令笔记
    swoole安装笔记
    Swoole学习笔记
    VM安装centos8实战
  • 原文地址:https://www.cnblogs.com/guangxiang/p/13216158.html
Copyright © 2020-2023  润新知