首页 > 其他分享 >动态代理-基本实现步骤、动态代理-增强方法

动态代理-基本实现步骤、动态代理-增强方法

时间:2023-02-14 10:22:11浏览次数:41  
标签:lenovo 对象 步骤 代理 proxy println 动态 public

动态代理-基本实现步骤

动态代理,增强对象Lenovo

  三个参数:

    1.类加载器:真实对象.getClass().getClassLoader()

    2.接口数组:真实对象.getClass().getInterfaces()

    3.处理器:new IncocationHandler()

代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行

  参数:

    1.proxy:代理对象

    2.method:代理对象调用的方法被封装为的对象

    3.arg:代理对象调方法时,传递的实际参数

创建SaleComputer接口

package com.example.proxy;

public interface SaleComputer {
    public String sale(double money);
    public void show();
}

创建Lenovo类实现SaleComputer接口

package com.example.proxy;

public class Lenovo implements SaleComputer {
    @Override
    public String sale(double money) {
        System.out.println("花了" + money + "元,买了一根冰棍");
        return "冰棍";
    }

    @Override
    public void show() {
        System.out.println("展示冰棍");
    }
}

创建ProxyTest测试类进行方法的测试

package com.example.proxy;

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

public class ProxyTest {
    public static void main(String[] args) {
        //创建真实对象
        Lenovo lenovo = new Lenovo();

        //动态代理,增强对象Lenovo
        /*
            三个参数:
                    1.类加载器:真实对象.getClass().getClassLoader()
                    2.接口数组:真实对象.getClass().getInterfaces()
                    3.处理器:new InvocationHandler()
         */
        SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {

            /*
                代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行
                    参数:
                        1.proxy:代理对象
                        2.method:代理对象调用的方法被封装为的对象
                        3.arg:代理对象调方法时,传递的实际参数
             */
            @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]);
                return null;
            }
        });

        //调用方法
        String sale = proxy_lenovo.sale(8000);
        System.out.println(sale);
        // proxy_lenovo.show();
    }
}

动态代理-增强方法

增强对象的功能:

设计模式:一些通用的解决固定问题的方式

  1.装饰模式

  2.代理模式

概念:

  1.真实对象:被代理的对象

  2.代理对象:

3.代理模式:代理对象代表代理真实对象,达到增强真实对象功能的目的

实现方式:

  1.静态代理:有一个类文件描述代理模式

  2.动态代理:在内存中形成代理类

实现步骤:

  1.代理对象和真实对象实现相同的接口

  2.代理对象 = Proxy.newProxyInstance()l

  3.使用代理对象调用方法

4.增强方法

增强方式:

  1.增强参数列表

  2.增强返回值类型

ProxyTest测试类

package com.example.proxy;

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

public class ProxyTest {
    public static void main(String[] args) {
        //创建真实对象
        Lenovo lenovo = new Lenovo();

        //动态代理,增强对象Lenovo
        /*
            三个参数:
                    1.类加载器:真实对象.getClass().getClassLoader()
                    2.接口数组:真实对象.getClass().getInterfaces()
                    3.处理器:new InvocationHandler()
         */
        SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {

            /*
                代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行
                    参数:
                        1.proxy:代理对象
                        2.method:代理对象调用的方法被封装为的对象
                        3.arg:代理对象调方法时,传递的实际参数
             */
            @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]);
                */

                //判断是否是sale方法
                if(method.getName().equals("sale")){
                    //增强参数
                    double money = (double) args[0];
                    money = money * 0.85;
                    System.out.println("专车接..");
                    //使用真实对象调用该方法
                    String  obj = (String) method.invoke(lenovo,money );
                    System.out.println("免费送货");
                    //增强返回值
                    return obj+"-鼠标垫";
                }else {
                    Object obj = method.invoke(lenovo,args);
                    return obj;
                }
            }
        });

        //调用方法
//        String sale = proxy_lenovo.sale(8000);
//        System.out.println(sale);
        proxy_lenovo.show();
    }
}

标签:lenovo,对象,步骤,代理,proxy,println,动态,public
From: https://www.cnblogs.com/wsfj/p/17118793.html

相关文章

  • CAD背景颜色怎么改?CAD背景颜色修改步骤
    在用浩辰CAD软件绘制图纸的过程中,如果觉得当前CAD背景颜色看起来不是很舒服,想要修改的话,你知道CAD背景颜色怎么改吗?本节课程就和小编一起来了解一下浩辰CAD软件中修改背景......
  • CAD线型比例因子怎么设置?CAD线型比例因子设置步骤
    在CAD设计过程中,绘制完虚线后,显示出来却和实线一样,这是什么情况呢?其实这是由于CAD线型比例设置有误而导致的,那么,CAD线型比例因子怎么设置?接下来就和小编一起来了解一下浩辰......
  • 如何导入定制的CAD图层?CAD图层文件导入步骤
    在CAD制图过程中,如果想要导入定制的CAD图层该如何操作?本文小编就以浩辰CAD建筑软件为例,给大家分享一下CAD图层文件导入的具体操作步骤吧!CAD图层文件导入步骤:首先要知道浩......
  • 台积电与ASML技术市场动态
    台积电与ASML技术市场动态美国市场调查公司Gartner于1月17日披露了2022年全球TOP10半导体厂家的销售额排名速报。据Gartner报道,排名第一的为韩国三星电子(656亿美元,约人民......
  • 一封传话一对多推送实现步骤
    前言前面介绍了一封传话聚合推送API的在线测试推送的步骤,可以实现一对一发送消息。但是我们希望实现:1.群组订阅功能:例如我和我的好友一起加入通道后,只推送一次我们两个......
  • 【BUCTOJ】问题H:Harnack函数(动态规划)
    样例输入43样例输出9提示样例输入2复制1313样例输出2复制156这题用动态规划做。首先审题,发现如果要求H(n,m),需要从1向上迭代出,符合动态规划题型.dp方程......
  • 利用反射和代理简单模拟mybatis实现简单的CRUD
    利用反射接口做java数据库操作今天突发奇想,好像一些基本的CRUD操作路数都是一样的,又想到mybatis中的操作,便想着简单的模拟一下。随便写写,就当练习反射了。Dao接口类:这......
  • 数的划分(动态规划)
    链接:https://ac.nowcoder.com/acm/problem/16695来源:牛客网将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5;1......
  • DP8.0安装步骤session
    [root@rx6600]#./omnisetup.sh-CM-ISTheomnisetup.shscriptdidnotcompletethelasttimeitwasrun.CellManagerstillhastobeinstalledInstallation......
  • 如何将视频作为Windows桌面动态壁纸,两步就可以搞定!
    Windows本身自带的设置是不支持直接将视频用作壁纸,所以要想实现这个功能需要第三方工具的帮助 一、软件简介这是一款可以将视频文件作为动态壁纸展示在电脑桌面的软件......