在工作中,一般是实体类对应的数据库表,另外再定义一个Model继承实体类,在model里往往添加一些辅助的属性。我们从数据库查出的数据放在实体类里,但是展现数据时需要用到model类,这时就需要把实体类转换成Model类。父类不可能强制转换成子类,所以写了一个通用的方法,适用于这种场景下的转换,代码如下:
/**
* 通过public的 get set方法进行复制,适合用于父类转换成子类
* @param objSource
* @param clazzSrc
* @param clazzDes
* @return
* @throws InstantiationException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
*/
public static <T, K> T copyByMethod(K objSource,Class<K> clazzSrc,Class<T> clazzDes ) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
if(null == objSource) return null;//如果源对象为空,则直接返回null
T objDes = clazzDes.newInstance();
return mergeByPublicMethod(objSource, objDes, clazzSrc, clazzDes);
}
public static <T, K> T mergeByPublicMethod(K objSource,T objDes,Class<K> clazzSrc,Class<T> clazzDes) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
if(null == objSource) return null;//如果源对象为空,则直接返回null
//获取目标对象的所有属性
Method[] methodDeses = clazzDes.getMethods();
Map<String,Method> m = new HashMap<String, Method>();
// 循环遍历方法,获取set方法
for ( Method method : methodDeses )
{
//如果不是set方法则跳过
if(!method.getName().startsWith("set")) continue;
m.put(method.getName().substring(3), method);
}
// 获得源对象所有方法
Method[] sourceMethods = clazzSrc.getMethods();
// 循环遍方法
for ( Method method : sourceMethods )
{
//如果是set方法则跳过
if(!method.getName().startsWith("get")) continue;
//如果目标对象不存在该方法,则跳过
if(!m.containsKey(method.getName().substring(3))) continue;
m.get(method.getName().substring(3)).invoke(objDes, method.invoke(objSource));
}
return objDes;
}