利用反射既可以获取也可以写入,首先咱们先写几个获取的例子。
一:利用反射修改各数据(利用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改为geggegegege
resultField.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值不能为空,若对象属性值存在为空的情况,则会抛出空指针异常,查看t