天天看點

java兩個類同步指派,JAVA反射将兩個不同類中的類型和屬性名相同的進行指派

public class Conversion {

private static Logger logger = LoggerFactory.getLogger(Conversion.class);

//将model中與entity中類型和名稱相同的屬性值指派給對應的entity的屬性,并傳回entity

public static T2 TypeConversion(T1 model, T2 entity) {

List> modelList = getFiledInfo(model);

List> 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類型轉換錯誤 " + ex);

}

}

}

}

}

return entity;

}

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;

}

}

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;

}

private static List> getFiledInfo(Object o) {

List> list = new ArrayList<>();

List 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 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;

}

}