Java循環(huán)對bean的屬性進行賦值的實現(xiàn)
項目背景
我們開發(fā)過程中會碰到這樣一類問題,就是數(shù)據(jù)層或三方接口返回的Bean對象需要轉(zhuǎn)換重新裝換一下我們需要的對象。我們通常的做法就是通過getter/setter方法進行一個一個進行賦值,這樣的話書寫起來太復(fù)雜了,并且太重復(fù)了。我嘗試寫了一個工具類,能夠?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 {
/**
* 按照屬性的順序賦值??山邮躰ull,但是不能跳過某個屬性進行賦值。就是說就算
* 有一個值為空,那你也要傳遞進行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è)置到目標(biāo)對象中
*
* @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連接 JDBC基礎(chǔ)知識(操作數(shù)據(jù)庫:增刪改查)
這篇文章主要介紹了Java連接 JDBC基礎(chǔ)知識,包括操作數(shù)據(jù)庫之增刪改查操作,需要的朋友可以參考下2021-04-04
java并發(fā)編程synchronized底層實現(xiàn)原理
這篇文章主要介紹了java并發(fā)編程synchronized底層實現(xiàn)原理2022-02-02
Java將文件夾保留目錄打包為 ZIP 壓縮包并下載的教程詳解
這篇文章主要介紹了Java將文件夾保留目錄打包為 ZIP 壓縮包并下載的教程詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
淺談BeanPostProcessor加載次序及其對Bean造成的影響分析
這篇文章主要介紹了淺談BeanPostProcessor加載次序及其對Bean造成的影響分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
深入淺析Java Object Serialization與 Hadoop 序列化
序列化是指將結(jié)構(gòu)化對象轉(zhuǎn)化為字節(jié)流以便在網(wǎng)絡(luò)上傳輸或者寫到磁盤永久存儲的過程。下面通過本文給大家分享Java Object Serialization與 Hadoop 序列化,需要的朋友可以參考下2017-06-06
Java畢業(yè)設(shè)計實戰(zhàn)之教室預(yù)訂管理系統(tǒng)的實現(xiàn)
這是一個使用了java+SpringBoot+Maven+Vue+mysql開發(fā)的教室預(yù)訂管理系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有教室預(yù)訂管理該有的所有功能,感興趣的朋友快來看看吧2022-02-02

