反射获取或修改对象属性的值

   利用反射既可以获取也可以写入,首先咱们先写几个获取的例子。

一:利用反射修改各数据(利用resultField.set修改)

首先定义实体类

public class Dog {private String dogUser;private int age;

DogUser"hahaha"改为"geggegegege"

Dog dog = new Dog();
dog.setAge(21);
dog.setDogUser("hahaha");
Object name = getValueByKey(dog, "dogUser");
System.out.println("获取到的属性名dogUser:"+name);

利用反射修改属性的工具类

public static <T> Object getValueByKey(T t, String key) {Class clazz = t.getClass();Field[] fields = clazz.getDeclaredFields();Field resultField = Arrays.stream(fields).filter(field -> field.getName().equals(key)).findFirst().get();Object obj = null;resultField.setAccessible(true);try {//把dogUser属性值从hahaha改为geggegegegeresultField.set(t,"geggegegege");obj = resultField.get(t);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return obj;}

测试结果:

在这里插入图片描述

二:利用反射获取各种形式的数据

首先定义实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Person {private String name = "zhangsan";private byte sex = 1;private int age = 18;private String introduce = "niuBility";
}

在定义一个接口常量

public interface Constant {int CONFIG_INT1 = 1;int CONFIG_INT2 = 2;int CONFIG_INT3 = 3;String CONFIG_STRING1 = "1";String CONFIG_STRING2 = "2";String CONFIG_STRING3 = "3";
}

1:获取单个对象的所有键值对(变量名-变量值)

   通过泛型参数限定传入一个对象,该方法传入一个对象,返回该对象所有的属性-值。

   注意:这里Collectors.toMap(key,value)中的value值不能为空,若对象属性值存在为空的情况,则会抛出空指针异常,查看toMap()方法源码,发现在map集合进行merge合并时进行了非空判断操作,如下:
在这里插入图片描述

   故这里使用Optional进行空值的包装,在为空时用0代替(看具体业务场景)。ps: 做map转换记得写键值冲突策略,养成好习惯,这里采用后者覆盖,(k1, k2) -> k2。

/*** 获取单个对象的所有键值对** @param t* @param <T>* @return*/public static <T> Map<String, Object> getKeyAndValue(T t) {Map<String, Object> map = Maps.newHashMap();Class clazz = (Class) t.getClass();Field[] fields = clazz.getDeclaredFields();map = Arrays.stream(fields).collect(Collectors.toMap(Field::getName, field -> {Object resultObj = null;field.setAccessible(true);try {resultObj = field.get(t);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return Optional.ofNullable(resultObj).orElse(0);}, (k1, k2) -> k2));return map;}

测试用例:

Map<String, Object> result1 = ReflectObjectUtil.getKeyAndValue(new Person());

测试结果:
在这里插入图片描述
2:获取单个对象指定键的值

第一种方式:

/*** 获取单个对象指定键的值** @param t* @param key* @param <T>* @return*/public static <T> Object getValueByKey(T t, String key) {Class clazz = t.getClass();Field[] fields = clazz.getDeclaredFields();Field resultField = Arrays.stream(fields).filter(field -> field.getName().equals(key)).findFirst().get();Object obj = null;resultField.setAccessible(true);try {obj = resultField.get(t);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return obj;}

测试用例:

Object result2 = ReflectObjectUtil.getValueByKey(new Person(), "name");

测试结果:

在这里插入图片描述

第二种方式(利用反射Method的invoke方法):

实体类:

public class Dog{private String name;private int age;
Dog dog = new Dog();
dog.setAge(21);
dog.setName("哈哈");
//第二种方式
Object name = getFieldValueByName("name", (Object) dog);
System.out.println("获取到的属性名:"+name);
public static Object getFieldValueByName(String fieldName, Object o) {try {String firstLetter = fieldName.substring(0, 1).toUpperCase();String getter = "get" + firstLetter + fieldName.substring(1);Method method = o.getClass().getMethod(getter, new Class[] {});Object value = method.invoke(o, new Object[] {});return value;} catch (Exception e) {return null;}}

测试结果:

在这里插入图片描述

3:获取多个对象的所有键值对

/*** 获取多个对象的所有键值对** @param objects* @return*/public static List<Map<String, Object>> getKeyAndValues(List<Object> objects) {return objects.stream().map(obj -> {Class clazz = obj.getClass();return Arrays.stream(clazz.getDeclaredFields()).collect(Collectors.toMap(Field::getName, field -> {Object resultObj = null;field.setAccessible(true);try {resultObj = field.get(obj);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return Optional.ofNullable(resultObj).orElse(0);}, (k1, k2) -> k2));}).collect(Collectors.toList());}

测试用例:

List<Map<String, Object>> result3 = ReflectObjectUtil.getKeyAndValues(Arrays.asList(new Person(), new Person()));

测试结果:

在这里插入图片描述

4:获取多个对象指定键的所有值

/*** 获取多个对象指定键的所有值** @param objects* @param key* @return*/public static List<Object> getValuesByKey(List<Object> objects, String key) {return objects.stream().map(obj -> {Class clazz = obj.getClass();return Arrays.stream(clazz.getDeclaredFields()).filter(field -> field.getName().equals(key)).map(field -> {Object resultObj = null;field.setAccessible(true);try {resultObj = field.get(obj);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return resultObj;}).collect(Collectors.toList());}).collect(Collectors.toList());}

测试用例:

List<Object> result4 = ReflectObjectUtil.getValuesByKey(Arrays.asList(new Person(), new Person()), "name");

测试结果:

在这里插入图片描述

5:获取静态变量(以下适用与类或接口参数)

/*** 获取静态变量** @param clazz* @param key* @return*/public static Object getValueByKey(Class<?> clazz, String key) {Field[] fields = clazz.getDeclaredFields();Field result = Arrays.stream(fields).filter(field -> key.equals(field.getName())).findFirst().get();Object obj = null;try {obj = clazz.getField(result.getName()).get(null);} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}return obj;}

测试用例:

String result5 = ReflectObjectUtil.getValueByKey(Constant.class, "CONFIG_INT1").toString();

测试结果:

在这里插入图片描述

6:获取类或接口中所有的常量

 /*** 获取类或接口中所有的常量** @param clazz* @return*/public static Map<String, Object> getFinalValues(Class<?> clazz) {Field[] fields = clazz.getDeclaredFields();return Arrays.stream(fields).filter(field -> Modifier.isFinal(field.getModifiers())).collect(Collectors.toMap(Field::getName, field -> {Object obj = null;try {obj = clazz.getField(field.getName()).get(null);} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}return obj;}));}

测试用例:

Map<String, Object> result6 = ReflectObjectUtil.getFinalValues(Constant.class);

测试结果:

在这里插入图片描述

测试用例汇总:

public class Test1 {public static void main(String[] args) {Map<String, Object> result1 = ReflectObjectUtil.getKeyAndValue(new Person());Object result2 = ReflectObjectUtil.getValueByKey(new Person(), "name");List<Map<String, Object>> result3 = ReflectObjectUtil.getKeyAndValues(Arrays.asList(new Person(), new Person()));List<Object> result4 = ReflectObjectUtil.getValuesByKey(Arrays.asList(new Person(), new Person()), "name");String result5 = ReflectObjectUtil.getValueByKey(Constant.class, "CONFIG_INT1").toString();Map<String, Object> result6 = ReflectObjectUtil.getFinalValues(Constant.class);}
}

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

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

相关文章

11、设计模式之外观模式

外观模式 外观模式&#xff08;Facade Pattern&#xff09;隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式&#xff0c;它向现有的系统添加一个接口&#xff0c;来隐藏系统的复杂性。 这种模式涉及到一个单一的…

LiveGBS流媒体平台GB/T28181用户手册-版本信息:查看机器码、切换查看流媒体服务

LiveGBS流媒体平台GB/T28181用户手册--版本信息:查看机器码、切换查看流媒体服务 1、版本信息1.1、查看机器码1.2、多个流媒体服务1.3、提交激活 2、搭建GB28181视频直播平台 1、版本信息 版本信息页面&#xff0c;可以查看到信令服务 流媒体服务相关信息&#xff0c;包含硬件…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

小程序丨数据功能如何使用

查询发布完成后&#xff0c;如发现信息有误或想要修改信息&#xff0c;老师可以使用数据功能在线修改已发布的查询内容。 数据功能包含导出、添加、编辑、更多操作&#xff0c;下面来教大家如何使用吧。 &#x1f4cc;使用教程 数据功能主要用于在线修改已发布的查询内容&#…

Day2 数组小结

数组的性质 1、数组的小标从0开始且地址连续 2、数组定位元素的效率非常高&#xff0c;几乎是O(n)的时间复杂度&#xff0c;因此查找很快 3、因为内存连续&#xff0c;因此进行删除或者添加的话&#xff0c;需要移动后面的元素 4、二维数组空间并不是连续的&#xff0c;如{{1,…

【LGR-187-Div.4】洛谷入门赛 #23

原题链接&#xff1a;题目列表 - 洛谷 B3970~B3977为A~H题 目录 A. 数字取模 B. 闰年 C. 二进制 D. 小 S 大战小 Q E. 放行李 F. 最大的和 G. 交题解 H. 更好的交换 A. 数字取模 直接模拟即可。将数字x的每一位都开一个变量存起来&#xff0c;再分别让每个变量对k取…

C语言 | Leetcode C语言题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; struct TreeNode* helper(int* nums, int left, int right) {if (left > right) {return NULL;}// 选择任意一个中间位置数字作为根节点int mid (left right rand() % 2) / 2;struct TreeNode* root (struct TreeNode*)malloc(sizeo…

ElasticSearch IK分词器的安装、词典扩展与停用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;云原生与服务部署-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 ​编辑 1. 前言 2. IK分词器安装 3. IK分词器词典扩展与停用 4. 总…

汽车整车检测的原由(北重试验平台制造厂家)

汽车整车检测是指对整车系统和构造各部分的性能、可靠性、安全性等方面进行全面检查和评估的过程。它是在汽车生产制造和销售使用环节中&#xff0c;为了保障驾驶安全和质量而必不可少的一项检测和评估工作。 1. 提升行车安全 汽车整车检测能够全面评估车辆的性能和安全性&…

音视频-常用的分析工具介绍-连续补充

目录 1&#xff1a;Audacity 2&#xff1a;MediaInfo 3&#xff1a;MP4Box 4&#xff1a;hexinator 5&#xff1a;Adobe Audition 6&#xff1a;VideoEye 7&#xff1a;YUVplayer &#xff08;YUV/RGB播放器&#xff09; 在做音视频分析时&#xff0c;经常用到各种分析工…

【无标题】思科交换路由中路由引入实验指南

路由引入是网络设计中的一个重要概念&#xff0c;它允许不同路由协议之间的路由信息交换。在思科网络设备中&#xff0c;路由引入可以增强网络的连通性和效率。本文将介绍路由引入的基本概念&#xff0c;并通过一个实验来演示如何在思科路由器中实现路由引入。 ## 路由引入的基…

头歌05-子集树实验-01背包

""" 题目&#xff1a;有n个重量分别为w{w_1,w_2,…,w_n}的物品&#xff0c;他们的价值分别为v{v_1,v_2,…,v_n}&#xff0c;给定一个容量为G的背包。 设计从这些物品中选取一部分物品放入该背包的方案&#xff0c;每个物品要么选中要么不选中&#xff0c;要求选…

读书笔记整理

1.对天才而言&#xff0c;任何努力都如做游戏般容易和有趣&#xff0c;兴趣是发展的原动力。从这个角度来看&#xff0c;通过普通人的劳动是无法创造天才的。 2.让孩子理解语法是很困难的。苦背不如练才是行之有效的办法。孩子们永远是故事迷&#xff0c;在教孩子们外语时&…

sqlserver查看正在执行的语句,锁,内存,cpu占用多等

sqlserver查看正在执行的语句 SELECT [Spid] session_Id ,ecid ,[Database] DB_NAME(sp.dbid) ,[User] nt_username ,[Status] er.STATUS ,[Wait] wait_type ,[Individual Query] SUBSTRING(qt.TEXT, er.statement_start_offset / 2, ( CASE WHEN er.statement_end_offs…

【有手就行】使用你自己的声音做语音合成,CPU都能跑,亲测有效

此文介绍在百度飞桨上一个公开的案例&#xff0c;亲测有效。 厌倦了前篇一律的TTS音色了吗&#xff1f;打开短视频听来听去就是那几个声音&#xff0c;快来试试使用你自己的声音来做语音合成吧&#xff01;本教程非常简单&#xff0c;只需要你能够上传自己的音频数据就可以(建议…

OpenLayers中实现对ImageStatic图层的扩展以支持平铺WrapX功能

地图平铺技术概述 地图平铺&#xff08;Tiling&#xff09;是一种将大尺寸地图数据分割成小块&#xff08;瓦片&#xff09;的技术&#xff0c;这在地图服务中非常常见。它使得地图数据能高效加载和展示&#xff0c;尤其适合网络环境。通过仅加载当前视图窗口所需的地图瓦片&a…

Spring Boot Web 开发:MyBatis、数据库连接池、环境配置与 Lombok 全面解析

推荐一个AI网站&#xff0c;免费使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鲸AI 1.0 MyBatis 概述 MyBatis 是一个优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 可以帮助我们将数据库操作抽象出来&#xff0c;使得我们的代码更加简洁…

SERVER ——查询(二)

目录 5. top 6. null 7. order by 8. 模糊查询&#xff1a; 9. 聚合函数 5. top top查询&#xff1a;查询表的前几行&#xff1b;下面是代码演示&#xff1a; --top&#xff08;前面的几个记录&#xff09; select top 2 * from emp; --查询表的前两列 select top 20 percent *…

Altium Designer 软件下载与安装

AD学习之旅&#xff08;1&#xff09;— Altium Designer 20 软件下载与安装 一、前言 本次软件安装参考自&#xff1a;Altium Designer 20 AD20软件安装详解教程 凡亿 Altium公司推荐的系统配置如下&#xff1a; 64位操作系统&#xff0c;不支持32位系统&#xff1b;Windows …

MoonDream2微调指南【最小VLM】

在本指南中&#xff0c;我们将探讨如何使用计算机视觉数据集对完全开源的小型视觉语言模型 Moondream2 进行微调&#xff0c;以计数项目&#xff08;这是 GPT-4V 一直表现不一致的任务&#xff09;&#xff0c;并以一种可以依赖输出用于生产应用程序的方式进行微调。 视觉语言…