比如想把 A (以下称modelWantToCast)的所有字段 赋值给B(以下称modelCastTo)
【需要字段名一样】
public static <T> T castModelToAnotherModel(Object modelWantToCast, Class<T> modelCastToClazz) {
if (modelWantToCast == null) {
return null;
}
// 粗暴地获取A的所有方法
Method[] dtoMethod = modelWantToCast.getClass().getDeclaredMethods();
String getMethodName;
T modelCastTo = null;
try {
// 实例化这个B
modelCastTo = modelCastToClazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
for (Method getMethod : dtoMethod) {
getMethodName = getMethod.getName();
if (getMethodName.indexOf("get", 0) == -1) {
continue;
}
...... 代码在下面
}
return modelCastTo;
}
1、之前经常用的很逗的方法
* 获取它的get set方法
* 从A中get出来
* 通过set方法set到A中去
String setMethodName = "set" + getMethodName.substring(3, getMethodName.length());// 获取set方法名字
Object value = null;// 取值
try {
value = getMethod.invoke(modelWantToCast);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
Class parameterTypes = getMethod.getReturnType();// 取参数的类
Method setMethod;
try {
// 获取set方法
setMethod = modelCastToClazz.getDeclaredMethod(setMethodName, parameterTypes);
} catch (NoSuchMethodException | SecurityException e) {
continue;
}
try {
// 粗暴地invoke进去
setMethod.invoke(modelCastTo, value);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
2、后来发现还有更加粗暴的方法
* 获取对象它get方法
* 从A中get出来
* 从field直接set进去
try {
Object value = getMethod.invoke(modelWantToCast);// 取值
if (value == null) {
continue;
}
String fileName = getFileNameFromGetterOrSetter(getMethodName); // 从get方法获取属性名
Field field = modelCastToClazz.getDeclaredField(fileName);
field.setAccessible(true);
field.set(modelCastTo, value);// 直接塞进去
} catch (NoSuchFieldException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}