利用java反射机制给实体类相同字段自动赋值

萧树
2023-12-01

一、封装一个工具类

1、简易版

package net.aexit.construct.acceptance.websky.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class ClassReflection {
      
	    /** 
     * @param class1 用于赋值的实体类  
     * @param class2 需要待赋值的实体类
     * 描述:反射实体类赋值 
     */  
    public static void reflectionAttr(Object class1,Object class2) throws Exception{  
        Class clazz1 = class1.getClass();
        Class clazz2 = class2.getClass();
		//  获取两个实体类的所有属性  
        Field[] fields1 = clazz1.getDeclaredFields();
        Field[] fields2 = clazz2.getDeclaredFields();  
		// 遍历class1Bean,获取逐个属性值,然后遍历class2Bean查找是否有相同的属性,如有相同则赋值  
        for (Field f1 : fields1) {  
            if(f1.getName().equals("id"))  
                continue;
            //设置访问权限
            f1.setAccessible(true);
            Object value = f1.get(class1);	    
            for (Field f2 : fields2) {  
                if(f1.getName().equals(f2.getName())){ 
               		//设置访问权限
                    f2.setAccessible(true);
                    f2.set(class2,value);	         
                }  
            }  
        }    
    }  
}  

2、复杂版

package net.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class ClassReflection {
      
    /** 
     * @param class1 用于赋值的实体类  
     * @param class2 需要待赋值的实体类
     * 描述:反射实体类赋值 
     */  
     
    public static void reflectionAttr(Object class1,Object class2) throws Exception{  
        Class clazz1 = Class.forName(class1.getClass().getName());  
        Class clazz2 = Class.forName(class2.getClass().getName());  
		// 获取两个实体类的所有属性  
        Field[] fields1 = clazz1.getDeclaredFields();
        Field[] fields2 = clazz2.getDeclaredFields();  
        ClassReflection cr = new ClassReflection();  
		// 遍历class1Bean,获取逐个属性值,然后遍历class2Bean查找是否有相同的属性,如有相同则赋值  
        for (Field f1 : fields1) {  
            if(f1.getName().equals("id"))  
                continue;  
            Object value = cr.invokeGetMethod(class1 ,f1.getName(),null);  
            for (Field f2 : fields2) {  
                if(f1.getName().equals(f2.getName())){  
                    Object[] obj = new Object[1];  
                    obj[0] = value;  
                    cr.invokeSetMethod(class2, f2.getName(), obj);  
                }  
            }  
        }  
          
    }  
      
    /** 
     *  
     * 执行某个Field的getField方法 
     * @param clazz 类 
     * @param fieldName 类的属性名称 
     * @param args 参数,默认为null 
     * @return  
     */  
    public Object invokeGetMethod(Object clazz, String fieldName, Object[] args) {
        String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);  
        Method method = null;
        try   
        {  
            method = Class.forName(clazz.getClass().getName()).getDeclaredMethod("get" + methodName);  
            return method.invoke(clazz);  
        }   
        catch (Exception e)  
        {  
            e.printStackTrace();  
            return "";  
        }  
    }  
      
    /** 
     *  
     * 执行某个Field的setField方法 
     * @param clazz 类 
     * @param fieldName 类的属性名称 
     * @param args 参数,默认为null 
     * @return  
     */  
    public Object invokeSetMethod(Object clazz, String fieldName, Object[] args)
    {         
        String methodName = fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);  
        Method method = null;  
        try   
        {  
            Class[] parameterTypes = new Class[1];  
            Class c = Class.forName(clazz.getClass().getName());  
            Field field = c.getDeclaredField(fieldName);   
            parameterTypes[0] = field.getType();  
            method = c.getDeclaredMethod("set" + methodName,parameterTypes);  
            return method.invoke(clazz,args);  
        }   
        catch (Exception e)  
        {  
            e.printStackTrace();  
            return "";  
        }  
    }

    //map转换为json字符串
    public static String hashMapToJson(HashMap map) {
        String string = "{";
        for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
            Map.Entry e = (Map.Entry) it.next();
            string += "'" + e.getKey() + "':";
            string += "'" + e.getValue() + "',";
        }
        string = string.substring(0, string.lastIndexOf(","));
        string += "}";
        return string;
    }

}  

二、调用工具类

ClassReflection.reflectionAttr(class1, class2);

三、赋值完成

注意:

1、id不赋值,主要给数据库两张表赋值,比如当前表和历史表,把当前表的相同字段的值赋值给历史表
2、简单版设置private修饰的字段可以被访问

 类似资料: