天天看點

關于不同對象且屬性名稱也不一樣的兩個對象之間的複制以及動态對象生成

最近遇到一個問題,要完成兩個對象之間的複制,也就是根據對象A的屬性值生成對應的對象B。其中A與B的屬性名不同,但是其實是一個東西。前後交了不同的名字而已。因為會後很多的這樣的情況,不可能每一個對象都寫一個方法。我尋求一種通用的方法。網上找到BeanUtils.copyProperties()等方法copy對象要求屬性名一緻才可以複制。。研究了一天最後自己解決。特此貼出來給同樣碰到此問題的同學們分享!!思路就是,在每一個背景對象中添加與前端對象的的屬性名映射表例如Map<String,string> param;param.put("name","id")..

然後寫一個工具方法完成如下功能:

 利用反射獲得A的屬性名數組,使用new CglibBean(temp)動态生成對應的轉換了屬性名的Object對象。(CglibBean用法請百度)。然後使用PropertyUtils.copyProperties(k, object);完成對象複制。具體看代碼自己領悟:

------------------------------------------------------------------------------------------------------------------------------------------------

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.util.HashMap;

import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;

import com.xiao2edu.setcfg.server.entity.TeacherPeriod;

import com.xiao2edu.setcfg.server.param.StringParam1;

public class BeanConvert {

//k為對應的實體對象,J為StringParam對象,param為屬性名對應表

public static Object getObject(Object k,Object j,Map<String,String> param) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{

//BeanUtils.copyProperties(k, j, str);

//擷取實體對象屬性名數組

Field[] fields=j.getClass().getDeclaredFields();

//屬性名,屬性類型

Map<String , Class> temp=new HashMap<>();

//屬性名,屬性值

Map<String , String> valueParam=new HashMap<>();

for(Field f:fields){

//設定通路權限,否則不能通路私有化屬性

f.setAccessible(true);

//轉換屬性名,屬性類型

temp.put(param.get(f.getName()), Class.forName("java.lang.String"));

String value="";

Object valueObject=f.get(j);

if(valueObject!=null){

value=valueObject.toString();

}

valueParam.put(param.get(f.getName()), value);

//System.out.println("哈哈"+valueParam.toString());

}

//System.out.println("AAA:"+temp.toString());

//根據參數數組生成CglibBean對象

CglibBean cglibBean=new CglibBean(temp);

for(Map.Entry<String, String> entry:valueParam.entrySet()){

//System.out.println(entry.getKey());

cglibBean.setValue(entry.getKey(), entry.getValue());

}

Object object=cglibBean.getObject();

//用object給K指派

PropertyUtils.copyProperties(k, object);

return k;

}

public static  void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{

TeacherPeriod teacherPeriod=new TeacherPeriod();

StringParam1 stringParam1=new StringParam1("11","22","33","44");

teacherPeriod=(TeacherPeriod) getObject( teacherPeriod ,stringParam1,teacherPeriod.getMapping());

System.out.println(stringParam1.getA());

System.out.println(teacherPeriod.toString());

}

}

繼續閱讀