• 动态代理的原理


    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();*/


    }
    }
     
  • 相关阅读:
    SQL入门语句之SELECT和WHERE
    SQL入门语句之INSERT、UPDATE和DELETE
    SQL入门语句之CREATE
    iOS高效调试
    兼容iOS 10 资料整理笔记
    iOS中常见的一些宏
    Extjs 日期的处理;字符串转日期;分隔获得小时;天数差;小时差;
    Ext.MessageBox.show更改按钮中的名称
    Extjs日期/可编辑表格grid/显示不正确————解决方案
    ExtJs Grid行显示不同颜色2
  • 原文地址:https://www.cnblogs.com/newcityboy/p/11517237.html
Copyright © 2020-2023  润新知