首页 > 其他分享 >动态代理1_基本实现步骤与动态代理2_增强方法

动态代理1_基本实现步骤与动态代理2_增强方法

时间:2023-02-21 09:24:32浏览次数:28  
标签:lenovo 对象 步骤 代理 proxy 动态 方法 public

动态代理1_基本实现步骤

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

    1. 装饰模式
    2. 代理模式
       概念:
        1. 真实对象:被代理的对象
        2. 代理对象:
        3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
        实现方式:
            1. 静态代理:有一个类文件描述代理模式
            2. 动态代理:在内存中形成代理类
               实现步骤:
                  1. 代理对象和真实对象实现相同的接口
                  2. 代理对象 = Proxy.newProxyInstance();
                  3. 使用代理对象调用方法。
                  4. 增强方法

                 增强方式:
               

 

 

 

 

package hf.xueqiang.proxy;

public interface SaleComputer {

    public String sale(double money);

    public void show();
}

 

 

package hf.xueqiang.proxy;

public interface SaleComputer {

    public String sale(double money);

    public void show();
}

 

package hf.xueqiang.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) {
        //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() {

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


                //使用真实对象调用该方法
                Object invoke = method.invoke(lenovo, args);
                


                return invoke;
            }
        });

        //3.调用方法

        String computer = proxy_lenovo.sale(8000);
        System.out.println(computer);

        proxy_lenovo.show();
    }
}

 

动态代理2_增强方法

         增强方式:
                1. 增强参数列表
                2. 增强返回值类型
                3. 增强方法体执行逻辑

    

    //判断是否是sale方法
                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("免费送货...");
                    //2.增强返回值
                    return obj+"_鼠标垫";
                }else{
                    Object obj = method.invoke(lenovo, args);
                    return obj;
                }



            }
        });

        //3.调用方法

        String computer = proxy_lenovo.sale(8000);
        System.out.println(computer);

 

 

    

标签:lenovo,对象,步骤,代理,proxy,动态,方法,public
From: https://www.cnblogs.com/x3449/p/17139709.html

相关文章

  • 【Spring AOP】【六】Spring AOP源码解析-代理对象创建过程
    1 前言我们看过Spring对AOP配置的解析以及通知器的筛选,也看过了动态代理的实现,这节那我们就看下Spring创建代理的过程,为下节看代理具体的执行过程做铺垫哈。那我们从哪......
  • ue5 - win10 打包项目为可执行exe 具体步骤
    1.背景开发环境是win10,我现在需要打包点击打包,会报错未正常安装windowsdk 我这里是安装好了,显示了win的小图标 ,如果未正确安装,会显示感叹号   2.解决安......
  • Vue 非单文件组件(不常用)3步骤(创建、注册、使用)
    Vue中使用组件的三大步骤:1、定义组件(创建)2、注册组件3、使用组件(写组件标签)一、如何定义一个组件?使用Vue.extend(options)创建,其中options和newVue(options)时传入......
  • 【代理】【二】代理源码解析-JDK动态代理使用及源码分析
    1 前言本节我们讲一下动态代理的实现过程,并且从源码分析下产生过程。看之前先简单看几个基础知识:函数接口BiFunction<T,U,R>:Rapply(Tt,Uu);就是参数是T、U......
  • 如何设计可以动态扩容缩容的分库分表方案?
    (1)选择一个数据库中间件,调研、学习、测试;(2)设计你的分库分表的一个方案,你要分成多少个库,每个库分成多少个表,3个库每个库4个表;(3)基于选择好的数据库中间件,以及在测试环境建......
  • 【Vue】vue项目目录介绍 es6的导入导出语法 vue项目开发规范 Vue项目编写步骤
    目录昨日回顾今日内容0vue-cli创建项目node.js环境创建vue-cli项目1vue项目目录介绍node_modulesindex.htmlapp.vuepackage.jsonpackage-lock.json2es6的导入导出语法ma......
  • Windows打开代理快捷方式
    最近使用电脑需要频繁打开关闭网络代理(全局代理会导致一些网站打不开),在想有没有快捷方式,一搜果然有,看来有跟我一样的使用习惯的人。传统切换代理开关,步骤如下:设置=>网......
  • 【代理】【一】代理源码解析-导读
    1 什么是代理代理是指给某一个对象提供一个代理对象,代理对象持有原对象的引用。一句话通过代理对象增强原对象的功能,比如在原对象调用一个方法的前后进行日志、事务操作......
  • net 中间件动态过滤api的返回值
    需求:api方法返回的信息是固定的,现在业务发生调整不同人员看到的返回字段可配置,为人员配置不可查看字段,方法的返回值中不可查看字段将会被过滤。处理思路:通过中间件处理api......
  • mybatis-plus动态表名
    packagecom.ruoyi.framework.config;importcom.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;importcom.baomidou.mybatisplus.core.toolkit.Plugin......