问题描述: 开发的过程中有个场景,有个数据结构是上传数据时用到的UploadData,这个结构在其他模块也有用到,因此定义完后一般不会修改添加。
但是我本地UI是用一个recyclerview来展示数据,需要在原有的数据结构上加两个状态信息,因此,本地新建了一个数据结构DisplayData继承了UploadData,在原基础上加上了两个状态位参数。但是每次数据下载和上传需要两个对象互相转换下。
解决方法:使用了Gson
- 下载的数据可以直接使用Gson转化为DisplayData类;
- 数据上传的时候可以使用Gson转为String,再转UploadData类进行上传;
之前尝试了属性拷贝的方法,但是这个只适合较为简单的数据结构,具体方法如下:
/**
* 复制对象属性包含父类
*
* @param from
* @param to
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static void copyPropertiesIncludeFather(Object from, Object to) throws Exception {
Log.i("test", "--- copyPropertiesIncludeFather ---");
Method[] fromMethods = getAllMethodsFromSonObject(from);
Method[] toMethods = getAllMethodsFromSonObject(to);
Method fromMethod = null, toMethod = null;
String fromMethodName = null, toMethodName = null;
for (int i = 0; i < fromMethods.length; i++) {
fromMethod = fromMethods[i];
fromMethodName = fromMethod.getName();
Log.i("test", "fromMethodName: " + fromMethodName);
if (fromMethodName.contains("get") || fromMethodName.contains("is")) {
if (fromMethodName.contains("get")) {
toMethodName = "set" + fromMethodName.substring(3);
} else {
toMethodName = "set" + fromMethodName.substring(2);
}
toMethod = findMethodByName(toMethods, toMethodName);
Log.i("test", "toMethodName: " + toMethodName);
if (toMethod == null) {
Log.i("test", "error: toMethod is null");
continue;
}
Object value = fromMethod.invoke(from, new Object[0]);
if (value == null) {
Log.i("test", "error: fromMethod value is null");
continue;
}
//集合类判空处理
if (value instanceof Collection) {
Collection newValue = (Collection) value;
if (newValue.size() <= 0)
Log.i("test", "error: newValue.size() <= 0");
continue;
}
toMethod.invoke(to, new Object[]{value});
} else {
Log.i("test", "error: fromMethodName");
continue;
}
}
}
/**
* 获取子类所有属性,包含继承过来的属性
*
* @param from
* @param to
* @throws Exception
*/
public static Method[] getAllMethodsFromSonObject(Object object) {
Method[] objectFatherMethods = object.getClass().getSuperclass().getDeclaredMethods();
Method[] objectMethods = object.getClass().getDeclaredMethods();
int fromMethodsLen = objectMethods.length + objectFatherMethods.length;
Method[] result = new Method[fromMethodsLen];
int index = 0;
for (int i = 0; i < objectFatherMethods.length; i++) {
result[index++] = objectFatherMethods[i];
}
for (int i = 0; i < objectMethods.length; i++) {
result[index++] = objectMethods[i];
}
return result;
}
这个工具demo试了可以复制简单的继承对象,但是我的父类又是多层嵌套,复制需要递归处理,想想麻烦了。。。
其实问题也不难,解决方法也简单,但是自己一开始想复杂了,真的是难的不会会的不难,根本原因还是不会的太多,很多工具使用不够熟练。
工具类参考链接如下,我在他基础上改了下,支持父类属性拷贝,支持boolean类型数据拷贝。 Android复制对象属性
|