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

动态代理的基本实现步骤和增强方法

时间:2023-01-30 10:46:22浏览次数:36  
标签:lenovo 对象 步骤 代理 proxy println 动态 public

增强对象功能:

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

1.装饰模式

2.代理模式

  概念:

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

    2.代理对象:

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

实现方式:

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

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

 

基本实现步骤:

SaleComputer接口:

package com.example.proxy;

/**
 * 代理模式
 */
public interface SaleComputer {

    public String sale(double money);

    public void show();

}

Lenovo实现类:

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) {
        //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]);

                return null;
            }
        });


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

    }
}

 

 

 

 

 

增强方法

  1、增强参数列表

  2、增强返回值类型

  3、增强方法体执行逻辑

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) {
        //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]);


                //判断是否是sale方法
                if (method.getName().equals("sale")){
                    //1.增强参数
                    double money = (double) args[0];
                    money = money * 0.85;
                    //使用真实对象调用该方法
                    Object obj = method.invoke(lenovo, money);
                    return obj+"鼠标垫";
                }else {
                    Object obj = method.invoke(lenovo, args);
                    return obj;
                }


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

        //proxy_lenovo.show();

    }
}

 

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

相关文章

  • linux静态库与动态库整理
    简化版本静态库:制作:gcc-g-c./*.c-I../include/arcrslibmod.a*.o使用gcc-gmain.c-L./-lmod-I../include/动态库:制作:gcc-g-c-fPIC-Wal......
  • ArrayList动态扩容
    一、ArrayList的动态扩容机制要了解其动态扩容机制就必须先看它的源码,源码是基于jdk1.8的1.ArrayList的主要属性//如果不指定容量(空构造器),则在添加数据时的空......
  • 日本国的情报收集确实不一般 —— 日本国立研究机关对世界各国科技发展动态及新闻的收
    最近在做国家项目需要收集日本的科技发展情况,搜着搜着发现原来日本国也在时刻不停的收集中国的科技发展动态及新闻,这么一细看就不得不说日本国在情报收集上确实是下了一番......
  • Redis的设计与实现(1)-SDS简单动态字符串
    现在在高铁上,赶着春节回家过年,无座站票,电脑只能放行李架上,面对着行李架撸键盘--看过<Redis的设计与实现>这本书,突然想起,便整理下SDS的内容,相对后面的章节,......
  • elemenplus form表单的动态配置写法
    elementplusform的动态配置写法模板代码部分<template> <divclass="cardcontent-box"> <el-alerttitle="通过component:is组件属性&&v-bind属性透传,可以将......
  • nginx的nginx.conf配置文件如何修改代理的路由
    方法location/api/{set$request_uri_new$request_uri;if($request_uri~"^/api/(.*)$"){set$request_uri_new/$1;}proxy_passhtt......
  • 流浪地球动态桌面壁纸【高清】
    壁纸是动态的,因为分辨率问题录下来的视频会卡顿,所以我就不上传视频了壁纸与工具以及全部打包上传网盘了,需要自取链接:https://pan.baidu.com/s/1hAJWxTHleINhG7PjF_5u2......
  • Rancher 反向代理
    Rancher反向代理 准备服务,把Deployments中的项目发布成服务,修改服务类型为 节点端口, 服务地址测试:http://192.168.91.130:8051/test  创建 Ingresses ......
  • DestoryJavaVM停止HotSpotVM的步骤
    1、一直等待,直到只有一个非守护的线程执行,注意此时HotSpotVM仍然可用;2、调用java.lang.Shutdown.shutdown()方法,它会调用Java上的shutdown钩子方法,如果finalization-on-exi......
  • 新买的陶瓷餐具清洗步骤
    新买的陶瓷餐具可按下面的步骤清洗:1.先用热水浸泡清洗一遍,主要是为了清除餐具表面粘附的灰尘和水溶性残留物。2.再加4%~5%的食醋到水中,煮开后放入餐具浸泡1~2小时,目的是中和......