通过反射获取一个对象的属性值三种方法比较

2023-11-05

为何要写这篇博客

反射机制的用途非常多,比如获取方法,属性名和属性值等,甚至可以获取标签等标签属性。今天来比较几种获取实例化对象的属性值方法

数据准备

@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class Student {
    String name;
    Integer ago;
    Integer num;
    String shcool;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAgo() {
        return ago;
    }

    public void setAgo(Integer ago) {
        this.ago = ago;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public String getShcool() {
        return shcool;
    }

    public void setShcool(String shcool) {
        this.shcool = shcool;
    }
}

方法实践

Student student = Student.builder()
                .name("小陈")
                .ago(22)
                .num(111111)
                .shcool("hr")
                .build();

        // 第一种
        Field[] declaredFields = student.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            String name = field.getName();
            Object value = field.get(student);
            System.out.println("属性" + name + "值为:" + value);

        }
        System.out.println("===================================================");
        // 第二种 利用PropertyDescriptor 获取方法
        Field[] declaredFieldV2s = student.getClass().getDeclaredFields();
        for (Field field : declaredFieldV2s) {
            PropertyDescriptor pd = new PropertyDescriptor(field.getName(),student.getClass());
            Method readMethod = pd.getReadMethod();
            Object invoke = readMethod.invoke(student);
            System.out.println("方法" + readMethod.getName() + "值为:" + invoke);
            Method writeMethod = pd.getWriteMethod();
        }


        System.out.println("===================================================");
        // 第三种 有错误 会出现 Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
        Method[] declaredFieldV3s = student.getClass().getMethods();
        for (Method field : declaredFieldV3s) {
            String name = field.getName();
            Object invoke = field.invoke(student);
            System.out.println("方法" + name + "值为:" + invoke);
        }

运行截图:
在这里插入图片描述

总结

基于第一种来说,相对其他方式更为快捷,但是要属性为私有的情况下,需要开启field.setAccessible(true);才能获取,还有一个是,对于student对象来说,get()方法不能传null,不然会报空指针方式,所以要对student进行非空判断。

基于第二种来说,通过PropertyDescriptor的对象,可以获得get方法,这样就可以不考虑属性的私有权限。但是比较繁琐,还有好处是可以获得set方法进行赋值,但是也得注意类型,String是无法赋予int的,不然可以转换。

  1. 不推荐第三种,会报错。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过反射获取一个对象的属性值三种方法比较 的相关文章

  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • ad16 怎么设置单独元件间距_硬件工程师基本功:DRC设置要点详解

    DRC就是检查设计是否满足所设置的规则 需要检查什么 其实都是和规则相对应的 在检查某个选项时 请注意对应的规则是否使能打开 1 执行菜单命令 工具 设计规则检查 快捷键 TD 如图11 1所示 打开如图11 2所示的设计规则检查器 图11
  • Spring Boot 学习研究笔记(八) - Spring Data JPA与Hibernate区别及配置

    一 JPA Hibernate Spring Data JPA 的区别与联系 1 什么是 JPA 它与Hibernate有什么关系 JPA Java Persistence API 是Java EE 5的标准ORM接口 也是ejb3规范的一
  • Windows操作系统TIME_WAIT状态的TCP连接快速回收时间

    问题 大规模Windows环境下 采用Nginx反向代理服务后 操作系统会产生较多TIME WAIT的TCP Transmission Control Protocol 连接 操作系统默认TIME WAIT的TCP连接回收时间是4分钟 TC
  • Qt QtCreator中项目的创建以及确定文件和目录的作用

    本文涉及 使用QtCreator进行第一个QT项目的创建 解析QT项目自动生成的各个文件 项目设计器的使用 查看QT项目文件结构 使用QtCreator配合控制台输出字符 建立QT项目目录 首先按照实际项目中的创建方法准备存放即将创建的案例
  • 批量创建多级文件夹(智能硬件项目文件夹管理为例)

    以智能硬件项目为例 创建项目文件夹 1 新建一个 txt文件 命名为 项目文件夹创建工具 txt 2 文件中输入如下内容 echo echo 项目文件夹创建工具 bat echo 作者 匠在江湖 echo 日期 2020 10 08 ech
  • ubuntu下的qt程序移植至ARM开发板

    一 第一步新建一个helloworld QT工程 二 使用qmake工具生成Makefile文件 在工程源码文件夹运行qmake opt qt 4 7 1 bin qmake 生成Makefile文件 三 执行编译命令 make 如下图所示
  • struts2.1.8+hibernate3.6.0+spring2.5三大框架整合demo

    1 打开myeclipse6 5 新建web工程 SSH 2 导入相关jar包 1 手动导入struts包 Struts2 1 8 最少依赖jar包7个 拷贝到 WEB INF lib目录下 在src目录下建立struts xml文件
  • java如何进阶?

    这篇回答没有长篇大论的 Java 进阶学习路线推荐 作为纯靠自学获得大厂 offer 的过来人 给几点建议 1 一定要动手实践 2 避免货物崇拜编程 3 提高系统设计能力 4 造轮子 5 深入学习 学会总结沉淀 当然也是需要扎实的基础的 例
  • C++标准模板库(STL)介绍与常见STL用法总结

    C 标准模板库 STL 介绍与常见STL用法总结 一 简介 STL是 C 标准模板库 Standard Template Library 的缩写 STL是C 为使用者提供的实现好的容器 包括vector 队列 栈 string等 掌握其对于
  • suse 内核编译安装_教你如何快速编译安装Linux新内核

    随着内核版本的更新换代 你是否有觉得自己的内核版本有些低了呢 如果有的话 没关系 今天小编就来教大家如何编译安装新的内核 在编译安装Linux内核之前先检查我们的虚拟机所在的磁盘空间 预留空间10G以上 不然编译安装内核无法完成 下面我们就
  • 如何优雅的打印数组

    如何优雅的打印数组 以下文章来源于沉默王二 作者沉默王二 https mp weixin qq com s 20s0XSsdUE2qJDP4OtM rw 在 Java 中 数组虽然是一个对象 但并未明确的定义这样一个类 因此也就没有覆盖 t
  • Linux在应用层读写寄存器的方法及/dev/mem分析

    1 Linux在应用层读写寄存器的方法 转自 https blog csdn net liukang325 article details 26601811 可以通过操作 dev mem设备文件 以及mmap函数 将寄存器的地址映射到用户空
  • Go-OpenWrt获取wan口ip、dns、网关ip

    Go OpenWrt获取wan口ip dns 网关ip 文章目录 Go OpenWrt获取wan口ip dns 网关ip 1 前言 2 解决方案思路 3 代码 1 前言 一般来说 Openwrt可以配置多个wan口和多个lan口 这里获取的
  • Vue父子组件通过prop异步传输数据踩坑

    今天碰到vue开发父子组件通信的一个小坑 情况是这样的 子组件使用echart展示图表 所需options由父组件通过prop传入 父组件中的options初始值为空 在mounted钩子函数中发起http请求获取数据然后更新options
  • Qt制作简单的无边框登陆窗口

    使用qt做简单的登录窗口 环境 win10 Qt5 创建项目 选择Widget类 勾选ui界面 因为我是用的默认类名所以类名是Widget 以下是Widget h ifndef WIDGET H define WIDGET H includ
  • 离散方法介绍

    离散成 的方法存在很多 但是各个方法直接存在优劣 从两方面进行参数比较 方面 1 从零点和极点 2 环节的频率响应 幅频和相频特性 系统控制方面 评价离散方法的参数 1 主导零 极点 2 系统带宽或者穿越频率 3 直流增益 4 增益裕度 5
  • Python采集世界大学排行榜,做数据可视化,来看看你的大学上榜没

    前言 这不是最近疫情又开始了 马上也要过年了 就是说很多大学都开始准备放假了吧 我有个表妹下周二就放寒假了哈哈 感觉现在读书寒假可长了 今天有点无聊 就来 爬取一下世界大学排行榜 做数据可视化 看看你们的学校上榜没 知识点 动态数据抓包 r
  • Algorithm oj 全集(已过oj)

    Algorithm oj 分治策略 作业1 找出数组中第 k 小的数 总提交数 616次 通过数 188次 通过率 30 52 内存限制 104857600 BYTE 时间限制 10000 MS 输入限制 1000 行 输出限制 1000
  • 【我的面试-01】Web前端开发实习岗-面试题总结

    简单开头 首先技术面试官会根据简历里所写的项目和个人掌握技术栈提问 我不知道已经改过多少次简历了 因为前期投简历是真的是沉在茫茫大海 捞漂流瓶都捞不到的那种 我的技术栈 Vue还在苦苦的自学当中 随便推荐一下coderwhy老师B站的教学视
  • 通过反射获取一个对象的属性值三种方法比较

    这里写目录标题 为何要写这篇博客 数据准备 方法实践 总结 为何要写这篇博客 反射机制的用途非常多 比如获取方法 属性名和属性值等 甚至可以获取标签等标签属性 今天来比较几种获取实例化对象的属性值方法 数据准备 Builder FieldD