jdk动态代理中invoke的return返回的值有什么用?

目录

  • 首先在接口中定义一个行为
  • 再定义一个目标角色实现接口,实现行为
  • 去代理角色类中解决一下报错,但是什么都不要写

invoke的return返回的值是调用方法中返回的值
下面我们来实例看一下

首先在接口中定义一个行为

public String toMarry02();

再定义一个目标角色实现接口,实现行为

注意这里return了一个字符串hi

@Override
    public String toMarry02(){
        System.out.println("二婚");
        return "hi";
    }

去代理角色类中解决一下报错,但是什么都不要写

@Override
    public String toMarry02() {
        return null;
    }

这个时候在获取代理对象的invoke方法中return null,不要return object

package com.svt.proxy;

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

/**
 * JDK动态代理类
 *      每一个代理类都需要实现InvocationHandler接口
 */
public class JdkHandler implements InvocationHandler {



    //目标对象
    private Object target;//类型不固定,创建时动态生成
    //通过带参构造器传递目标对象


    public JdkHandler(Object target) {
        this.target = target;
    }

    /**
     * 1.调用目标对象的方法(返回object)
     * 2.增强目标对象的行为
     *
     * @param proxy 调用该方法的代理实例
     * @param method 目标对象的方法
     * @param args 目标对象的方法所需要的参数
     * @return
     * @throws Throwable
     */

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //前后都可能会有增强行为,不一定都要有,只是可能会有
        //用户的增强行为
        System.out.println("============方法执行前");


        // 调用目标对象中的方法(返回object)
        Object object=method.invoke(target,args);


        //用户的增强行为
        System.out.println("方法执行后============");

        return null;//调用方法中返回的值
    }
    /**
     * 获取代理对象
     * public static Object newProxyInstance(ClassLoader loader,
     *                                       Class<?>[] interfaces,
     *                                       InvocationHandler h)
     *  Loader:类加载器
     *  interfaces:接口数组
     *      target.getClass().getInterfaces():目标对象的接口数组
     *  h:InvocationHandler接口(传入InvocationHandler接口的实现类)
     * @return
     */
    public Object getProxy(){
        Object object= Proxy.newProxyInstance(this.getClass().getClassLoader(),
                                                target.getClass().getInterfaces(),
                                                this);
        return object;
    }
}

在测试类中进行测试

public class JdkHandlerTest {
    public static void main(String[] args) {
        //目标对象
        You you = new You();
        //得到代理类
        JdkHandler jdkHandler = new JdkHandler(you);
        //得到代理对象
        Marry marry = (Marry) jdkHandler.getProxy();
        //通过代理对象调用目标对象的方法
        String msg = marry.toMarry02();
        System.out.println(msg);
    }
}

得到的结果是初始化了,但是没有返回值,因为我们将invoke中的返回值写成了null,所以不管在目标角色里写多少返回值都不会出现在控制台
在这里插入图片描述
这个时候我们只要将获取代理对象的invoke方法中return null改为return object,就能将结果呈现在控制台
在这里插入图片描述
这就是获取代理对象的invoke方法中return object的用处,最好写成return object哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/288293.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

金和OA C6 UploadFileEditorSave.aspx 文件上传漏洞复现

0x01 产品简介 金和OA协同办公管理系统软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效率的核心思想,为用户提供一整套标准的办公自动化解决方案,以帮助…

关于执行 roslaunch xxxxx yyyy.launch 后,没能进入 RViz 就卡死的问题

Problem 话不多说&#xff0c;先看图。 终端也会提示有报错&#xff08;可能是这种&#xff0c;但不确定&#xff09;&#xff1a; 这是发现问题所在之后&#xff0c;故意改错&#xff0c;然后尝试的。☝ Solution 总以为是显卡的问题&#xff0c;一直在研究怎么在 Ubuntu2…

适合前后端开发的可视化编辑器(拖拽控件)

分享一个面向研发人群使用的前后端分离的低代码软件——JNPF。 JNPF与市面上其他的低代码&#xff08;轻流、宜搭、微搭、简道云、轻流、活字格等等&#xff09;&#xff0c;后者更倾向于非编程人员使用&#xff0c;让业务线人员自行构建应用程序。而 JNPF 这款低代码产品是面向…

AIGC带给开发者的冲击

未来会有两种开发者&#xff0c;一种是会使用AIGC工具的开发者另一种是不会使用AIGC的开发者&#xff0c;AIGC的出现提高了开发效率和代码质量&#xff0c;对开发者意味着需要不断学习和适应新的技术和工作范式&#xff0c;开发者可以把更多的精力放在高级抽象的定义以及更高维…

2024年阿里云优惠券领取及使用教程

阿里云作为国内领先的云计算服务提供商&#xff0c;一直致力于为客户提供优质、高效的服务。为了更好地回馈客户&#xff0c;阿里云经常会推出各种优惠活动&#xff0c;其中就包括阿里云优惠券。本文将详细介绍如何领取及使用阿里云优惠券。 一、阿里云优惠券介绍 阿里云优惠券…

【网络技术】【Kali Linux】Wireshark嗅探(四)域名系统(DNS)

一、实验目的 本次实验使用wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解域名系统&#xff08;DNS&#xff09;的工作原理。 二、域名系统概述 简单来说&#xff0c;域名系统&#xff08;Domain Name System, DNS&#xff09;将域名&#xff08;可以理解为“网址”…

2024年MySQL学习指南(一),探索MySQL数据库,掌握未来数据管理趋势

文章目录 前言1. 数据库的相关概念1.1 数据1.2 数据库1.3 数据库管理系统1.4 数据库系统1.5 SQL 2. MySQL数据库2.1 MySQL安装2.2 MySQL配置2.2.1 添加环境变量2.2.2 新建配置文件2.2.3 初始化MySQL2.2.4 注册MySQL服务2.2.5 启动MySQL服务 2.3 MySQL登录和退出2.4 MySQL卸载2.…

01-03

利用模板类完成顺序表

ExecutorCompletionService详解

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 摘要ExecutorCompletionService适用场景ExecutorCompletionService使用ExecutorCompletionService原理解析注意事项总结 摘要 ExecutorCompletionService 是Jav…

花为缘享奢体验中心,轻创业最佳选择

公开数据显示&#xff0c;中国市场上近10年奢侈品存量近4万亿&#xff0c;但二奢流转率仅为5%&#xff0c;相比于日本、美国接近30%的流转率&#xff0c;差距巨大。二奢行业下隐藏着一个万亿级市场&#xff0c;个人如何实现奢侈品创业&#xff0c;花为缘享奢体验中心为你服务。…

Python中的垃圾回收机制是什么

一、写在前面&#xff1a; 我们都知道Python一种面向对象的脚本语言&#xff0c;对象是Python中非常重要的一个概念。在Python中数字是对象&#xff0c;字符串是对象&#xff0c;任何事物都是对象&#xff0c;而它们的核心就是一个结构体--PyObject。 typedef struct_object{i…

瞬态抑制二极管(TVS)的注意事项与布局布线?|深圳比创达电子

一、瞬态抑制二极管(TVS)的注意事项 工作电压/反向截止电压&#xff08;VRVRWM&#xff09;此参数不需要降额&#xff0c;保证大于等于工作电路最大工作电压即可&#xff0c;越接近越好。该参数为TVS的固有参数。VBR是TVS固有参数&#xff0c;与外界冲击波形无关。 被保护器件…

分布式(8)

目录 36.什么是TCC&#xff1f; 37.分布式系统中常用的缓存方案有哪些&#xff1f; 38.分布式系统缓存的更新模式&#xff1f; 39.分布式缓存的淘汰策略&#xff1f; 40.Java中定时任务有哪些&#xff1f;如何演化的&#xff1f; 36.什么是TCC&#xff1f; TCC&#xff08…

低代码技术:颠覆数据孤岛的技术利器

在当今数据驱动的世界中&#xff0c;数据的价值无可忽视。然而&#xff0c;很多组织面临一个普遍的问题&#xff0c;即数据孤岛。数据孤岛指的是不同部门或系统之间无法有效共享和集成数据的情况。这限制了组织在数据驱动的决策和创新方面的能力。然而&#xff0c;低代码平台的…

雍禾植发成毛发行业标杆!雍禾医疗获“年度医疗大健康消费企业”

近期&#xff0c;以“新视野 新链接”为主题的2023 EDGE AWARDS全球创新评选榜单正式发布。该评选由钛媒体发起&#xff0c;聚焦大健康产业&#xff0c;由权威行业专家、王牌分析师、专业投资机构、用户代表共同评审&#xff0c;兼顾综合专业性、影响力、创新性三大维度评选而出…

2024 年加密货币领域需要注意的 5 大网络安全威胁

加密货币世界主要存在于数字领域&#xff0c;面临着众多不断变化的网络威胁&#xff0c;这些威胁所带来的风险&#xff0c;给个人和企业组织造成了重大损失。 本文将研究2023年年加密货币领域的一些关键网络安全趋势&#xff0c;这些趋势预计将持续到 2024 年&#xff0c;并对…

为什么大学c语言课不顺便教一下Linux,Makefile

为什么大学c语言课不顺便教一下Linux&#xff0c;Makefile&#xff0c;git&#xff0c;gdb等配套工具链呢? 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux的资料从专业入门到高级教程工具包」&…

kubeadm来快速搭建一个K8S集群

二进制搭建适合大集群&#xff0c;50台以下的主机 kubeadm更适合中下企业的业务集群 我们采用了二进制包搭建出的k8s集群&#xff0c;本次我们采用更为简单的kubeadm的方式来搭建k8s集群。 二进制的搭建更适合50台主机以上的大集群&#xff0c;kubeadm更适合中小型企业的集群…

Matplotlib基础

目录&#xff1a; 一、绘制函数图像&#xff1a;二、创建图形对象&#xff1a;三、绘制多子图&#xff1a; 一、绘制函数图像&#xff1a; from matplotlib import pyplot as plt import numpy as np #生成&#xff08;-50,50&#xff09;的数组 x np.arange(-50,50) #计算因…

SSM的校园二手交易平台----计算机毕业设计

项目介绍 本次设计的是一个校园二手交易平台&#xff08;C2C&#xff09;&#xff0c;C2C指个人与个人之间的电子商务&#xff0c;买家可以查看所有卖家发布的商品&#xff0c;并且根据分类进行商品过滤&#xff0c;也可以根据站内搜索引擎进行商品的查询&#xff0c;并且与卖…