Java循環(huán)對bean的屬性進行賦值的實現(xiàn)
項目背景
我們開發(fā)過程中會碰到這樣一類問題,就是數(shù)據(jù)層或三方接口返回的Bean對象需要轉(zhuǎn)換重新裝換一下我們需要的對象。我們通常的做法就是通過getter/setter方法進行一個一個進行賦值,這樣的話書寫起來太復雜了,并且太重復了。我嘗試寫了一個工具類,能夠?qū)Ω鞣N場景下的對象進行相互賦值。
功能介紹
- 可以為將要賦值的對象進行單個單個的按順序賦值
- 通過傳遞的屬性的index(就是他是第幾個屬性)獲取本屬性的值
- 返回對象中屬性的數(shù)量
- 兩個對象之間相互拷貝屬性值
- 傳遞一個list,遍歷bean進行賦值
- 傳遞一個數(shù)組,對對象進行賦值
- 返回一個對象的屬性值集合
- 返回一個對象的屬性值數(shù)組
注意注意注意?。?!
getDeclaredFields方法不能保證字段聲明的順序進行返回,但是基本上會按照這個順序的。所以以下的方法是建立在返回正確的順序上的基礎(chǔ)上的,但是兩個對象相互拷貝是沒有問題的。
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; /** * @author haoyan.shi * 想設(shè)計一個能夠解析一個bean的全部屬性并按照順序進行遍歷 */ public class ObjectUtils { /** * 按照屬性的順序賦值。可接受null,但是不能跳過某個屬性進行賦值。就是說就算 * 有一個值為空,那你也要傳遞進行null * * @param target * @param value * @param <E> * @return */ public static <E> E forEachSetValue(E target, Object value) { if (target == null) { return target; } List<Field> fields = new ArrayList<>(); try { // 1.解析出所有的屬性 Field[] declaredFields = target.getClass().getDeclaredFields(); for (Field declaredField : declaredFields) { declaredField.setAccessible(true); fields.add(declaredField); } // 2.把每個屬性放入一個集合中 if (fields.size() <= 0) { return target; } while (fields.get(0).get(target) != null) { fields.remove(0); } Field field = fields.get(0); field.set(target, value); fields.remove(0); } catch (Exception exception) { exception.printStackTrace(); } return target; } /** * 本方法為了遍歷索引進行賦值 * * @param e * @param index * @return */ public static Object forEachGetValue(Object e, int index) { try { Field[] declaredFields = e.getClass().getDeclaredFields(); for (Field declaredField : declaredFields) { declaredField.setAccessible(true); } return declaredFields[index].get(e); } catch (IllegalAccessException illegalAccessException) { illegalAccessException.printStackTrace(); } return e; } public static int size(Object o) { if (o == null) { return 0; } Field[] declaredFields = o.getClass().getDeclaredFields(); return declaredFields.length; } /** * 本方法是為了把已經(jīng)有值得對象中屬性名相同的名屬性賦值到?jīng)]有值得對象用。 * * @param target * @param value */ public static <E> E copyValueFromObject(E target, Object value) { if (target == null || value == null) { return null; } Field[] vs = target.getClass().getDeclaredFields(); Field[] ts = value.getClass().getDeclaredFields(); try { for (int i = 0; i < vs.length; i++) { for (int j = 0; j < ts.length; j++) { if (vs[i].getName().equals(ts[j])) { ts[j].set(target, vs[i].get(value)); } } } } catch (Exception e) { e.printStackTrace(); } return target; } /** * 這個方法能把list中的值按照順序設(shè)置到目標對象中 * * @param target * @param value * @param <E> * @return */ public static <E> E forEachSetValueFromList(E target, List value) { if (target == null || value == null || value.size() == 0) { return target; } Field[] ts = target.getClass().getDeclaredFields(); try { for (int i = 0; i < ts.length; i++) { ts[i].set(target, value.get(i)); } } catch (Exception e) { e.printStackTrace(); } return target; } /** * 從數(shù)組中進行設(shè)置值 * * @param target * @param value * @param <E> * @return */ public static <E> E forEachSetValueFromArray(E target, Object[] value) { if (target == null || value == null || value.length == 0) { return target; } Field[] ts = target.getClass().getDeclaredFields(); try { for (int i = 0; i < ts.length; i++) { ts[i].set(target, value[i]); } } catch (Exception e) { e.printStackTrace(); } return target; } public static Object[] getArrayValue(Object o) { Field[] declaredFields = o.getClass().getDeclaredFields(); Object[] result = new Object[declaredFields.length]; try { for (int i = 0; i < declaredFields.length; i++) { result[i] = declaredFields[i].get(o); } } catch (Exception e) { e.printStackTrace(); } return result; } public static List getListValue(Object o) { Field[] declaredFields = o.getClass().getDeclaredFields(); List result = new ArrayList(declaredFields.length); try { for (int i = 0; i < declaredFields.length; i++) { result.add(declaredFields[i].get(o)); } } catch (Exception e) { e.printStackTrace(); } return result; } }
后期擴展:
1.我們可以定義一些注解,進行屬性匹配。注入值更精確。
2.還可以用jdk1.8中的函數(shù)接口,進行賦值。
3.甚至都可以作為jdk的新特性去擴展這個功能。
到此這篇關(guān)于Java循環(huán)對bean的屬性進行賦值的文章就介紹到這了,更多相關(guān)Javabean屬性賦值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)二分查找BinarySearch算法
這篇文章主要介紹了Java實現(xiàn)二分查找BinarySearch算法,二分查找針對的是一個有序的數(shù)據(jù)集合,每次都通過跟區(qū)間的中間元素對比,將待查找的區(qū)間縮小為之前的一半,直到找到要查找的元素,或者區(qū)間被縮小為 0,需要的朋友可以參考下2023-12-12微信js sdk invalid signature簽名錯誤問題的解決方法分析
這篇文章主要介紹了微信js sdk invalid signature簽名錯誤問題的解決方法,結(jié)合實例形式分析了微信簽名錯誤問題相關(guān)解決方法,需要的朋友可以參考下2019-04-04java 通過聚合查詢實現(xiàn)elasticsearch的group by后的數(shù)量
這篇文章主要介紹了java 通過聚合查詢實現(xiàn)elasticsearch的group by后的數(shù)量,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12jpa多數(shù)據(jù)源時Hibernate配置自動生成表不生效的解決
這篇文章主要介紹了jpa多數(shù)據(jù)源時Hibernate配置自動生成表不生效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02ImportBeanDefinitionRegistrar手動控制BeanDefinition創(chuàng)建注冊詳解
這篇文章主要為大家介紹了ImportBeanDefinitionRegistrar手動控制BeanDefinition創(chuàng)建注冊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12