最近因为经常会操作讲两个JavaBean之间相同的字段互相填充,所以就写了个偷懒的方法。记录一下
/**
* 将两个JavaBean里相同的字段自动填充
* @param dto 参数对象
* @param obj 待填充的对象
*/
public static void autoFillEqFields(Object dto, Object obj) {
try {
Field[] pfields = dto.getClass().getDeclaredFields();
Field[] ofields = obj.getClass().getDeclaredFields();
for (Field of : ofields) {
if (of.getName().equals("serialVersionUID")) {
continue;
}
for (Field pf : pfields) {
if (of.getName().equals(pf.getName())) {
PropertyDescriptor rpd = new PropertyDescriptor(pf.getName(), dto.getClass());
Method getMethod = rpd.getReadMethod();// 获得读方法
PropertyDescriptor wpd = new PropertyDescriptor(pf.getName(), obj.getClass());
Method setMethod = wpd.getWriteMethod();// 获得写方法
setMethod.invoke(obj, getMethod.invoke(dto));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将两个JavaBean里相同的字段自动填充,按指定的字段填充
* @param dto
* @param obj
* @param String[] fields
*/
public static void autoFillEqFields(Object dto, Object obj, String[] fields) {
try {
Field[] ofields = obj.getClass().getDeclaredFields();
for (Field of : ofields) {
if (of.getName().equals("serialVersionUID")) {
continue;
}
for (String field : fields) {
if (of.getName().equals(field)) {
PropertyDescriptor rpd = new PropertyDescriptor(field, dto.getClass());
Method getMethod = rpd.getReadMethod();// 获得读方法
PropertyDescriptor wpd = new PropertyDescriptor(field, obj.getClass());
Method setMethod = wpd.getWriteMethod();// 获得写方法
setMethod.invoke(obj, getMethod.invoke(dto));
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
但这样写不能把父类有的属性自动赋值所以修改了一下
/**
* 将两个JavaBean里相同的字段自动填充
* @param obj 原JavaBean对象
* @param toObj 将要填充的对象
*/
public static void autoFillEqFields(Object obj, Object toObj) {
try {
Map<String, Method> getMaps = new HashMap<>();
Method[] sourceMethods = obj.getClass().getMethods();
for (Method m : sourceMethods) {
if (m.getName().startsWith("get")) {
getMaps.put(m.getName(), m);
}
}
Method[] targetMethods = toObj.getClass().getMethods();
for (Method m : targetMethods) {
if (!m.getName().startsWith("set")) {
continue;
}
String key = "g" + m.getName().substring(1);
Method getm = getMaps.get(key);
if (null == getm) {
continue;
}
// 写入方法写入
m.invoke(toObj, getm.invoke(obj));
}
} catch (Exception e) {
e.printStackTrace();
}
}