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

简介: * 获取单个对象的所有键值对

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

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

首先定义实体类

public class Dog {
private String dogUser;
private int age;
1
2
3
把DogUser的"hahaha"改为"geggegegege"

Dog dog = new Dog();
dog.setAge(21);
dog.setDogUser("hahaha");
Object name = getValueByKey(dog, "dogUser");
System.out.println("获取到的属性名dogUser:"+name);
1
2
3
4
5
利用反射修改属性的工具类

public static 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改为geggegegege
resultField.set(t,"geggegegege");
obj = resultField.get(t);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return obj;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
测试结果:

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

首先定义实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Person {

private String name = "zhangsan";

private byte sex = 1;

private int age = 18;

private String introduce = "niuBility";

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
在定义一个接口常量

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
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
测试用例:

Map result1 = ReflectObjectUtil.getKeyAndValue(new Person());
1
测试结果:

相关文章
|
6月前
|
JavaScript 前端开发
如何删除对象中的属性?如何想对象中添加属性?
如何删除对象中的属性?如何想对象中添加属性?
63 0
对象的属性和值转换
对象的属性和值转换
39 0
|
Java
Java 反射修改类的常量值、静态变量值、属性值
Java 反射修改类的常量值、静态变量值、属性值
946 0
|
存储 Kotlin
【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )
【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )
221 0
【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )
|
存储 JavaScript 前端开发
访问对象的属性,你知道有哪些方法?
相信对象对于每个使用JavaScript的人来说都不陌生。访问对象的属性几乎日常开发每天都在用。下面我们一起探索下有哪些方式可以实现属性的访问。
194 0
|
JSON JavaScript 前端开发
18、属性描述对象
JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。
178 0
Java反射得到属性和属性的值和设置属性的值
Java反射得到属性和属性的值和设置属性的值
|
C#
C# 类相同属性赋值
原文:C# 类相同属性赋值 做项目时偶尔B类赋值给A类,碰巧A和B类型很多属性字段名是一样的,或者只是大小写不一样,这是可以利用泛型,反射来写一个自动化赋值的方法。 下面方法不考虑大小写不一样的情况,如果要考虑,可以使用字符串方法 ToUpper() 、ToLower() 后,对比字段名是否一样。
1266 0
|
C#
C#使用反射设置属性值
最近在Refix一个支持Excel文件导入导出功能时,发现有用到反射的相关技能。故而在网上查了些资料,通过代码调试加深下理解。 class Program { static void Main(string[] args) { ...
1370 0