package com.example.demo;
import java.lang.reflect.Field;
/**
* 需求描述:同一类的不同对象,如果某个字段的null则从另外的一个对象中赋值。
*/
public class StudentTest {
//静态内部类
static class Student {
private String name;
private String sex;
private String password;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", password='" + password + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public static void main(String[] args) throws Exception{
Student student = new Student();
student.setName("刘德华");
student.setPassword(null);
student.setSex(null);
Student another = new Student();
another.setPassword("778899");
another.setSex("男");
find(student,another,"name");
find(student,another,"password");
find(student,another,"sex");
System.out.println("student=" + student.toString());
find(another,student,"name");
find(another,student,"password");
find(another,student,"sex");
System.out.println("another=" + another.toString());
}
public static String find(Student student,Student another,String filedName) throws Exception{
Field[] stuField = student.getClass().getDeclaredFields();
Field[] anotherField = another.getClass().getDeclaredFields();
for (int i=0;i< stuField.length;i++){
//Student with modifiers "private"
stuField[i].setAccessible(true);
anotherField[i].setAccessible(true);
if(stuField[i].getName().equals(filedName)){
if(stuField[i].get(student) == null){
//解决两个对象的某属性都同时为null的情况
if(anotherField[i].get(another) != null) {
/**
* 递归算法
*/
String filedNameValue = find(another, student, filedName);
stuField[i].set(student, filedNameValue);
}
break;
}else{
return (String)stuField[i].get(student);
}
}
}
return null;
}
}