有些时候我们需要获取到一个对象中的所有属性名和属性值,对其值进行操作,例如判断对象中某个属性是否是空值。
这种时候我们再使用get(),set()来进行操作就会有些麻烦了。
因此我们可以选择使用反射来进行遍历对象中的所有属性名和属性值。在遍历中编写逻辑来对属性进行操作。
示例代码如下:
- 创建一个Person作为实体类
package com.vinci.reflectionTraversalAttribute.entity;
public class Person {
private String name;
private int age;
private String email;
public Person() {
}
public Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
}
- 创建一个Person对象并给其属性赋值
/**
* @description: 创建一个Person对象,并给属性赋值
* @author: Vinci
* @date: 2023/11/9 10:10
**/
public static Person getPerson(){
return new Person("Vinci",24,"atvinci@foxmail.com");
}
- 利用反射来遍历对象中的属性
public static void main(String[]args) throws IllegalAccessException {
//创建一个Person对象
Person person = getPerson();
//通过getDeclaredFields()方法获取对象类中的所有属性(含私有)
Field[] fields = person.getClass().getDeclaredFields();
//遍历属性
for (Field field : fields) {
//通过setAccessible()设置为true,允许通过反射访问私有变量
field.setAccessible(true);
//获取属性值
Object value = field.get(person);
//获取属性名
String name = field.getName();
//输出到控制台
System.out.println("属性名:"+name+" 值:"+value);
//对name字段进行修改
if("name".equals(name)){
field.set(person,"李予安");
}
}
//输出修改过的对象到控制台
System.out.println("\n修改过的对象: " + person.toString());
}
控制台输出结果: