- Field : 提供有關(guān)類或接口的單個字段的信息和動態(tài)訪問。
getName() :返回此Field對象表示的字段的名稱.
getType(): 返回一個Class對象,該對象標(biāo)識此Field對象表示的字段的聲明類型 。- getDeclaredField(String name) : 返回一個Field對象。
- getDeclaredFields() :返回一個Field數(shù)組
- 當(dāng)然用的的不止這些,具體看業(yè)務(wù)和Class 文檔
public class Conversion {
????//將model中與entity中類型和名稱相同的屬性值賦值給對應(yīng)的entity的屬性,并返回entity
public static <T1, T2> T2 TypeConversion(T1 model, T2 entity) {
List<Map<String, Object>> modelList = getFiledInfo(model);
List<Map<String, Object>> entityList = getFiledInfo(entity);
for (Map e : entityList) {
for (Map m : modelList) {
/**
* 判斷類型和屬性名是否都相同
*/
if (e.get("type").toString().equals(m.get("type").toString()) && e.get("name")
.toString()
.equals(m.get("name").toString())) {
try {
Field f = entity.getClass().getDeclaredField(e.get("name").toString());
f.setAccessible(true);
f.set(entity, m.get("value"));
} catch (Exception ex) {//查看其父類屬性
try {
Field f = entity.getClass().getSuperclass().getDeclaredField(e.get("name").toString());
f.setAccessible(true);
f.set(entity, m.get("value"));
} catch (Exception e1) {
logger.error(ex.getMessage(), "conversion類型轉(zhuǎn)換錯誤 " + ex);
}
}
}
}
}
return entity;
}
/**
* 根據(jù)屬性名獲取屬性值
*/
private static Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[]{});
Object value = method.invoke(o, new Object[]{});
return value;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return null;
}
}
/**
* 獲取屬性名數(shù)組
*/
private static String[] getFiledName(Object o) {
Field[] fields = o.getClass().getDeclaredFields();
String[] fieldNames = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
fieldNames[i] = fields[i].getName();
}
return fieldNames;
}
/**
* 獲取屬性類型(type),屬性名(name),屬性值(value)的map組成的list
*/
private static List<Map<String, Object>> getFiledInfo(Object o) {
List<Map<String, Object>> list = new ArrayList<>();
List<Field> fields = new ArrayList<>();
fields.addAll(Arrays.asList(o.getClass().getDeclaredFields()));
/**
* 如果存在父類,獲取父類的屬性值,類型,名稱并添加到一起
*/
Class sc = o.getClass().getSuperclass();
if (sc != null) {
fields.addAll(Arrays.asList(sc.getDeclaredFields()));
}
for (Field field : fields) {
Map<String, Object> infoMap = new HashMap<>();
infoMap.put("type", field.getType().toString());
infoMap.put("name", field.getName());
infoMap.put("value", getFieldValueByName(field.getName(), o));
list.add(infoMap);
}
return list;
}
}
// 這邊比較數(shù)據(jù)的值
public List<Map<String, Object>> getCompareData(HecYbMedCodeSyncEntity entityHis, HecYbMedCodeSyncEntity entityNow) {
List<Map<String, Object>> lists = new ArrayList<>();
List<Map<String, Object>> modelList = Conversion.getFiledInfo(entityHis);
List<Map<String, Object>> entityList = Conversion.getFiledInfo(entityNow);
modelList.forEach(mapHis -> {
entityList.forEach(mapNow -> {
Map<String, Object> map = new HashMap<>();
//這邊需要把獲取得到的字段名 跟 醫(yī)保中心的字段名做個匹配,把我們這邊的字段名轉(zhuǎn)成他們那邊的字段名
if ( mapHis.get("name").toString().equals(mapNow.get("name").toString())) {//判斷名字相同
if (!(mapHis.get("value").toString().equals(mapNow.get("value").toString())) ) {//判斷值不相同 且 反射實體不為空
map.put("bgzdbm", fieldMappedEnum.getSourceFieldName()); //變更字段編碼
map.put("bgzdmc", fieldMappedEnum.getDesc()); //變更字段名稱
map.put("bgqz00", mapHis.get("value").toString()); //變更前值
map.put("bghz00", mapNow.get("value").toString()); //變更后值
map.put("bgsj00", DateUtil.limitDay(entityNow.getSyncTime())); //變更時間
lists.add(map);
}
}
});
});
我的設(shè)計思路是,設(shè)計一個枚舉,把我數(shù)據(jù)庫的字段A,和webServer接口上的字段對應(yīng)上B,這樣給B賦值的時候就可以通過枚舉獲取得到A,并且通過A就可以獲取到A的值,這樣就繞過了人工的給B賦值的繁瑣操作。
成都一家集口碑和實力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團隊和靠譜的建站技術(shù),十年企業(yè)及個人網(wǎng)站建設(shè)經(jīng)驗 ,為成都上千余家客戶提供網(wǎng)頁設(shè)計制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營銷型網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計,同時也為不同行業(yè)的客戶提供成都網(wǎng)站制作、網(wǎng)站設(shè)計的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)。
調(diào)用如下:
FieldMappedEnum fieldMappedEnum = FieldMappedEnum.findSourceFieldByTarget(mapHis.get("name").toString());
map.put("bgzdbm", fieldMappedEnum.getSourceFieldName()); //變更字段編碼
map.put("bgzdmc", fieldMappedEnum.getDesc()); //變更字段名稱
....
當(dāng)前標(biāo)題:Java反射機制Reflection在項目中的應(yīng)用
轉(zhuǎn)載注明:http://jinyejixie.com/article32/jjgopc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、做網(wǎng)站、App設(shè)計、靜態(tài)網(wǎng)站、搜索引擎優(yōu)化、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)