[java] 利用反射,将对象A中与对象B中字段名相同的属性值赋予对象B
前言:
最近开发遇到了这样一个需求,前端提交的表单对应类是origin,但后端数据库表对应类是target,两者中有重合字段,origin类中有待处理字段(例如String[] ids),我想到的解决方案是将origin对象中与target对象的同名字段值赋予target,再将待处理字段拆分后赋予target进行存储。首先想到的就是手动赋值(target.setValue(origin.getValue);)但这样不利于扩展并且不符合开闭原则。
所以使用反射进行同名字段赋值。
流程图:
sameFieldSetValue()
getValue():
setValue():
代码:
sameFieldSetValue():
private <T> T sameFieldSetValue(Object origin, T target){ Field[] originFields = origin.getClass().getDeclaredFields(); Field[] targetFields = target.getClass().getDeclaredFields(); //遍历各对象寻找相同名字段,并赋值 for(int i=0; i<originFields.length; i++){ String originFieldName = originFields[i].getName(); for(int j=0; j<targetFields.length; j++){ if(targetFields[j].getName().equals(originFieldName)){ Object field = getValue(origin, originFieldName); setValue(target, originFieldName, field); } } } return target; }
getValue():
private Object getValue(Object object, String fieldName) { try{ Field[] fields = object.getClass().getDeclaredFields(); for (Field field : fields) { String fName = field.getName(); if (!fName.equals(fieldName)) { continue; } //获取对应字段的属性描述器并获取get方法,使用invoke调用 PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fName, object.getClass()); Method getMethod = propertyDescriptor.getReadMethod(); if (getMethod != null) { return getMethod.invoke(object); } } } catch (Exception e){ e.printStackTrace(); } return null; }
setValue():
private void setValue(Object object, String fieldName, Object value){ try{ Field[] fields = object.getClass().getDeclaredFields(); for (int i=0; i<fields.length; i++){ String fName = fields[i].getName(); if(!fName.equals(fieldName)){ continue; } //获取对应字段的属性描述器并获取set方法,使用invoke调用 PropertyDescriptor propertyDescriptor = new PropertyDescriptor(fName, object.getClass()); Method setMethod = propertyDescriptor.getWriteMethod(); if (setMethod != null) { setMethod.invoke(object, value);
break; } } } catch (Exception e){ e.printStackTrace(); } }