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

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(使用前将#替换为@)

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

  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • Netbeans 8.1 Gnome 3 GTK+ UI 字体和选项卡高度

    我刚刚在运行 GNOME 3 桌面的 Ubuntu 16 04 上安装了 NetBeans 8 1 如果可能的话 我想继续使用 IDE 的 GTK 外观和感觉 但 UI 上的字体 尤其是选项卡中的字体 太小且重叠 我尝试添加 fontsiz
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • Java Logger 未记录到 Netbeans 中的输出

    我正在 Netbeans 中使用 Maven 启动一个 Java 项目 我编写了一些代码来使用 Logger 类进行日志记录 但是 日志记录似乎不起作用 在程序开始时 我运行 Logger getLogger ProjectMainClas
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应

随机推荐

  • 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