什么意思呢?先說明一下場景吧!項目中有一個類(Vehicle,其中大概有50多個屬性),另外還有若干API,暫且叫做:api100, api200, api300吧。其中api100和api200用于查詢Vehicle,分別查詢出一部分屬性值,兩部分拼裝在一起才能形成一個完整的Vehicle,即:api100=>Vehicle, api200=>Vehicle,需要將兩個不完整的Vehicle組成一個完整的Vehicle傳給api300來繼續下一個請求。
Spring和Apache beanutil都提供了copyProperty方法,但是都不能滿足需求,因為第一個Vehicle對象的值為null的屬性會覆蓋第二個對象,算了,還是自己來寫吧,反正前兩個用的也是反射實現的。那就自己用反射吧!
/**
* 用source中的屬性值不為null的屬性值填充target
* @param source 要復制的對象
* @param target 要復制的對象
*/
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();
}
}