zoukankan      html  css  js  c++  java
  • 动态代理的原理

    1、定义一个接口   2、定义一个类来实现该接口    3、使用proxy来动态获取对象的方法,并通过三种不同的方法来增强实体对象的方法(参数增强,返回值增强,方法体增强)
    package cn.hopetesting.proxy;

    /**
    * @author newcityman
    * @date 2019/9/13 - 15:22
    */
    public interface SaleComputer {
    public String sale(double money);
    public void show();
    }

    package cn.hopetesting.proxy;

    /**
    * @author newcityman
    * @date 2019/9/13 - 15:24
    */
    public class lenovo implements SaleComputer {

    @Override
    public String sale(double money) {
    System.out.println("花了"+money+"元买了一台联想电脑.....");
    return "联想电脑";
    }

    @Override
    public void show() {
    System.out.println("炫耀电脑");
    }
    }


    package cn.hopetesting.proxy;

    import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;

    /**
    * @author newcityman
    * @date 2019/9/13 - 15:34
    */
    public class ProxyTest {
    public static void main(String[] args) {
    //1、创建真实对象
    lenovo lenovo = new lenovo();
    //2、动态代理增强Lenovo对象
    /*
    * 三个参数
    * 1、类加载器:真实对象.getClass().getClassLoader()
    * 2、接口数组:真实对象.getClass().getInterfaces()
    * 3、处理器: new InvocationHandler()
    * */
    SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.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 {
    /*System.out.println("动态代理的方法被执行了");
    System.out.println(method.getName());
    System.out.println(args[0]);*/

    if (method.getName().equals("sale")) {
    //1、增强参数
    double money = (double) args[0];
    money = money * 0.85;
    System.out.println("专车接");
    // 使用真实对象调用方法
    String obj =(String) method.invoke(lenovo, money);
    System.out.println("免费送货。。。。。");
    //增强返回值
    obj = obj +"_移动硬盘";
    return obj;
    } else {
    Object obj = method.invoke(lenovo, args);
    return obj;
    }
    }
    });

    //2、调用方法
    String computer = proxy_lenovo.sale(5000);
    System.out.println(computer);

    /* proxy_lenovo.show();*/


    }
    }
     
  • 相关阅读:
    【Android编译】各个模块编译方法
    【Android调试遇到的问题总结】手机com口无法识别
    【Android编译error】error: lambda capture 'this' is not used [-Werror,-Wunused-lambda-capture]
    【Open-JDK】配置java的Open-JDK环境
    【Log】java文件中直接加log的方法
    【BT+Log】BT抓取log方法以及log级别修改(HCI+Logcat)
    【Bluetooth】获取蓝牙地址的6种方法,及btnvtool工具使用
    【adb】adb shell 查看 APK 信息(权限等)
    【NFC】NFC Tag和NFC CE(Card Emulation)区别
    【Wifi】adb命令打开/关闭蓝牙、NFC(bluetooth)开关
  • 原文地址:https://www.cnblogs.com/newcityboy/p/11517237.html
Copyright © 2011-2022 走看看