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

news2024/12/23 1:07:50

目录

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

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哦!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读|冷冻电镜】DISCA: High-throughput cryo-ET structural pattern mining

论文题目 High-throughput cryo-ET structural pattern mining by unsupervised deep iterative subtomogram clustering 摘要 现有的结构排序算法的吞吐量低&#xff0c;或者由于依赖于可用模板和手动标签而固有地受到限制。本文提出了一种高吞吐量的、无需模板和标签的深度…

开源大模型应用开发

1.大语言模型初探 ChatGLM3简介 ChatGLM3-6B 是一个基于 Transformer 的预训练语言模型&#xff0c;由清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练发布。该模型的基本原理是将大量无标签文本数据进行预训练&#xff0c;然后将其用于各种下游任务&#xff0c;例如文…

c++基础(对c的扩展)

文章目录 命令空间引用基本本质引用作为参数引用的使用场景 内联函数引出基本概念 函数补充默认参数函数重载c中函数重载定义条件函数重载的原理 命令空间 定义 namespace是单独的作用域 两者不会相互干涉 namespace 名字 { //变量 函数 等等 }eg namespace nameA {int num;v…

力扣每日一题99:恢复二叉搜索树

题目 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例 1&#xff1a; 输入&#xff1a;root [1,3,null,null,2] 输出&#xff1a;[3,1,null,null,2] 解释&#xff1a;3 不能是 1 …

数脉观察二丨 详解CroPoolv2.0锁仓收益机制 文末附锁仓教程

1月1日元旦佳节期间&#xff0c;CyberVein基金会支持打造的CroPoolv2.0最新版本正式上线&#xff0c;获得了圈内媒体和知名KOL多方的关注&#xff0c;在Staking领域掀起了热议&#xff0c;用户可以前往CroPool.net进行锁仓体验。 CroPool v2.0新增“锁仓”功能板块&#xff0c…

findata——科学数据搜索引擎

findata由中国科学院计算机网络信息中心提供&#xff0c;具有很强的数据检索能力。 网址如下&#xff1a;https://www.findata.cn/ 主界面十分简洁 我们试着输入landsat&#xff0c;点击搜索按钮&#xff0c;给出以下结果。 我们还可以添加条件&#xff0c;进一步进行筛选 数…

three.js gltf后处理颜色异常(伽马校正)

效果&#xff1a; 应用了伽马校正&#xff0c;好像效果不明显 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…

RocketMQ5.0消息过滤

前言 消费者订阅了某个主题后&#xff0c;RocketMQ 会将该主题中的所有消息投递给消费者。若消费者只需要关注部分消息&#xff0c;可通过设置过滤条件在 Broker 端进行过滤&#xff0c;只获取到需要关注的消息子集&#xff0c;避免接收到大量无效的消息。 以电商交易场景为例…

手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯

目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 &#xff08;一&#xff09;HTML5及其优点 &#xff08;二&#xff09;HTML5在手机上实现视频应用功能的优势 四、手机HTML5…

FFmpeg之——获取上传视频的尺寸(长、宽)

获取上传视频的尺寸&#xff1a; 获取视频尺寸通常需要借助第三方库FFmpeg。 首先&#xff0c;确保你的系统中已安装了FFmpeg&#xff0c;并且FFmpeg的可执行文件路径已经添加到你的系统环境变量中。 1.官网下载ffmpeg 进入 链接: ffmpeg官网 网址&#xff0c;点击下载wind…

milvus学习(一)cosin距离和欧式距离

参考&#xff1a;https://blog.csdn.net/qq_36560894/article/details/115408613 归一化以后的cosin距离和欧式距离可以相互转化&#xff0c;未归一化的不可以相互转化&#xff08;因为距离带单位&#xff09;。

AI的明天从这里开始:OJAC近屿智能带您探索AIGC星辰大海的无限可能!

你是对人工智能充满好奇的编程小白&#xff0c;还是渴望工作赋能的白领&#xff1f;或者是想投身AIGC浪潮的创业者&#xff1f;无论你的背景如何&#xff0c;只要你对AI世界充满热情&#xff0c;我们OJAC近屿智能AIGC星辰大海大模型工程师和产品经理启航班以及系列课程都欢迎您…

利用Spring Cloud和Java系统设置优化工程项目管理系统源码的二次开发体验

工程项目管理涉及众多环节和角色&#xff0c;如何实现高效协同和信息共享是关键。本文将介绍一个采用先进技术框架的Java版工程项目管理系统&#xff0c;该系统支持前后端分离&#xff0c;功能全面&#xff0c;可满足不同角色的需求。从项目进度图表到施工地图&#xff0c;再到…

Java 语言概述

Java 概述 是 SUN&#xff08;Stanford University Network&#xff0c;斯坦福大学网络公司&#xff09;1995年推出的一门高级编程语言 是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏览器中运行。这些 Java 程序被称为 Java 小程序&am…

深入研究矫正单应性矩阵用于立体相机在线自标定

文章&#xff1a;Dive Deeper into Rectifying Homography for Stereo Camera Online Self-Calibration 作者&#xff1a;Hongbo Zhao, Yikang Zhang, Qijun Chen,, and Rui Fan 编辑&#xff1a;点云PCL 欢迎各位加入知识星球&#xff0c;获取PDF论文&#xff0c;欢迎转发朋…

文件监控软件丨文件权限管理工具

文件已经成为企业最重要的资产之一。然而&#xff0c;文件的安全性和完整性经常受到威胁&#xff0c;如恶意软件感染、人为误操作、内部泄密等。 为了确保文件的安全&#xff0c;文件监控软件应运而生。本文将深入探讨文件监控软件的概念、功能、应用场景和未来发展等方面。 文…

Deep Q-Network (DQN)理解

DQN&#xff08;Deep Q-Network&#xff09;是深度强化学习&#xff08;Deep Reinforcement Learning&#xff09;的开山之作&#xff0c;将深度学习引入强化学习中&#xff0c;构建了 Perception 到 Decision 的 End-to-end 架构。DQN 最开始由 DeepMind 发表在 NIPS 2013&…

中兴通讯携手龙蜥社区,共创繁荣生态 | 2023龙蜥操作系统大会

12 月 17-18 日&#xff0c;由开放原子开源基金会指导&#xff0c;龙蜥社区主办&#xff0c;阿里云、中兴通讯、浪潮信息、Arm、Intel 等 24 家理事单位共同承办&#xff0c;主题为“云智融合共筑未来”的 2023 龙蜥操作系统大会在北京圆满结束。本次大会上&#xff0c;中兴通讯…

海外静态IP和动态IP有什么区别?推荐哪种?

什么是静态ip、动态ip&#xff0c;二者有什么区别&#xff1f;哪种好&#xff1f;关于这个问题&#xff0c;不难发现&#xff0c;在知道、知乎上面的解释有很多&#xff0c;但据小编的发现&#xff0c;这些回答都是关于静态ip和动态ip的专业术语解释&#xff0c;普通非专业人事…

java生产设备效率管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web生产设备效率管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为ac…