什么意思呢?先說(shuō)明一下場(chǎng)景吧!項(xiàng)目中有一個(gè)類(Vehicle,其中大概有50多個(gè)屬性),另外還有若干API,暫且叫做:api100, api200, api300吧。其中api100和api200用于查詢Vehicle,分別查詢出一部分屬性值,兩部分拼裝在一起才能形成一個(gè)完整的Vehicle,即:api100=>Vehicle, api200=>Vehicle,需要將兩個(gè)不完整的Vehicle組成一個(gè)完整的Vehicle傳給api300來(lái)繼續(xù)下一個(gè)請(qǐng)求。
Spring和Apache beanutil都提供了copyProperty方法,但是都不能滿足需求,因?yàn)榈谝粋€(gè)Vehicle對(duì)象的值為null的屬性會(huì)覆蓋第二個(gè)對(duì)象,算了,還是自己來(lái)寫吧,反正前兩個(gè)用的也是反射實(shí)現(xiàn)的。那就自己用反射吧!
/**
* 用source中的屬性值不為null的屬性值填充target
* @param source 要復(fù)制的對(duì)象
* @param target 要復(fù)制的對(duì)象
*/
public static <T> void mergeProperties(T source, T target){
try {
Field[] fields = source.getClass().getDeclaredFields();
for(Field field : fields){
field.setAccessible(true);
Object value = field.get(source);
if (value != null){
field.set(target, value);
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}