java将某一个对象中的非空字段覆盖到另外一个对象中

package com.dxy.study_0628.study.reflect;

import com.dxy.study_0628.domain.Tu;
import com.dxy.study_0628.domain.User;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * 关于反射的使用
 */
public class fs_04 {
    
    
    public static void main(String[] args) throws IllegalAccessException {
    
    
        ArrayList<User> user1 = new ArrayList<>();
        user1.add(new User());
        ArrayList<Tu> user2 = new ArrayList<>();
        user2.add(new Tu());
        fs_04 fs_04 = new fs_04();
        //fs_04.copy(user1,user2);
        User user = new User(4, null, "3");
        System.out.println(user);
        fs_04.copy2(user, new Tu(7, "us","yy"));
        System.out.println(user);
    }
    public List copy(List lista,List listb){
    
    
      if(lista.size()>0){
    
    
          Object o = lista.get(0);
          Class<?> aClass = o.getClass();
          //获取lista的所有属性
          Field[] declaredFields = aClass.getDeclaredFields();
          for (Field field:declaredFields){
    
    
              System.out.println(field);
          }
      }
        System.out.println("----------------");
      if(listb.size()>0){
    
    
          Class<?> bClass = listb.get(0).getClass();
          Field[] declaredFields = bClass.getDeclaredFields();
          for (Field field:declaredFields){
    
    
              System.out.println(field);
          }
      }
        return  lista;
    }

    /**
     * 属性赋值
     * @param object1
     * @param object2
     * @return
     * @throws IllegalAccessException
     */
    public Object copy(Object object1,Object object2) throws IllegalAccessException {
    
    
        Field[] declaredFields1 = object1.getClass().getDeclaredFields();
        Field[] declaredFields2 = object2.getClass().getDeclaredFields();
        for (Field field:declaredFields1){
    
    
            System.out.println(field);
        }
        System.out.println("----------------");
        for (Field field:declaredFields2){
    
    
            System.out.println(field);
        }
        for (Field field:declaredFields1){
    
    
            if (!field.isAccessible()) {
    
    
                field.setAccessible(true);
            }
            //System.out.println(field.getName() + ":" + field.get(object1));
            //一个一个判断这个属性有没有
            for (Field field2:declaredFields2){
    
    
                if (!field2.isAccessible()) {
    
    
                    field2.setAccessible(true);
                }

                if(field.getName().equals(field2.getName())){
    
    
                    //为空或者为0的情况下都要覆盖
                    if(field.get(object1)==null || (field.getType().getName().equals("int") && (int)(field.get(object1))==0)){
    
    
                        //一个个赋值过去
                        field.set(object1,field2.get(object2));
                    }
                }

            }
        }
        return object1;
    }

    /**
     * 相同属性由object2赋值到object1
     * 只有为空或者为0(int)时才会覆盖
     * @param object1
     * @param object2
     * @throws IllegalAccessException
     */
    public void copy2(Object object1,Object object2) throws IllegalAccessException {
    
    
        //获取各自对象
        Field[] declaredFields1 = object1.getClass().getDeclaredFields();
        Field[] declaredFields2 = object2.getClass().getDeclaredFields();
        //遍历object1
        for (Field field:declaredFields1){
    
    
            if (!field.isAccessible()) {
    
    
                field.setAccessible(true);
            }
            //System.out.println(field.getName() + ":" + field.get(object1));
            //一个一个判断这个属性有没有
            for (Field field2:declaredFields2){
    
    
                if (!field2.isAccessible()) {
    
    
                    field2.setAccessible(true);
                }
                if(field.getName().equals(field2.getName())){
    
    
                    //为空或者为0的情况下都要覆盖
                    if(field.get(object1)==null || (field.getType().getName().equals("int") && (int)(field.get(object1))==0)){
    
    
                        //一个个赋值过去
                        field.set(object1,field2.get(object2));
                    }
                }

            }
        }
    }


}

Guess you like

Origin blog.csdn.net/qq_40711092/article/details/120688140