实际开发中我们经常会遇到Form表单和我们的Model实体类有很多字段重合,又不想每天忙于写if,else判断值是否存在,于是写了个偷懒版本,开箱即用。
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
/**
* 遍历对象属性值(利用反射实现),可以在需要对 对象中的每个字段都执行相同的处理时使用
*
* @author Tan
*/
public class DisposeUtil
{
/**
* @param object 需要给其他类赋值的对象
* @param clazz target类Class
*/
public static Object dispose(Object object, Class<?> clazz)
{
try
{
// 等价于 new操作
Object target = clazz.newInstance();
// 获取实体类的所有属性,返回Field数组
Field[] field = object.getClass().getDeclaredFields();
// 遍历所有属性
for (Field item : field)
{ // 获取属性名
String name = item.getName();
// 驼峰转换 方便构建get set方法
name = name.substring(0, 1).toUpperCase() + name.substring(1);
// 获取属性的类型
String type = item.getGenericType().toString();
// 获取get方法
Method m = object.getClass().getMethod("get" + name);
// 判断类型,使用包装类,属性名带有class 开头
if ("class java.lang.String".equals(type))
{
// 调用getter方法获取属性值
String value = (String) m.invoke(object);
m = target.getClass().getMethod("set" + name, String.class);
m.invoke(target, value);
}
else if ("class java.lang.Integer".equals(type))
{
Integer value = (Integer) m.invoke(object);
if (value != null)
{
m = target.getClass().getMethod("set" + name, Integer.class);
m.invoke(target, value);
}
}
else if ("class java.lang.Long".equals(type))
{
Long value = (Long) m.invoke(object);
if (value != null)
{
m = target.getClass().getMethod("set" + name, Long.class);
m.invoke(target, value);
}
}
else if ("class java.lang.Boolean".equals(type))
{
Boolean value = (Boolean) m.invoke(object);
if (value != null)
{
m = target.getClass().getMethod("set" + name, Boolean.class);
m.invoke(target, value);
}
}
else if ("class java.util.Date".equals(type))
{
Date value = (Date) m.invoke(object);
if (value != null)
{
m = target.getClass().getMethod("set" + name, Date.class);
m.invoke(target, value);
}
}
// 如果有需要,可以仿照上面继续进行扩充,再增加对其它类型的判断
}
return target;
}
// 这里偷懒了一下统一处理了,建议有条件分段处理
catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException |
InstantiationException e)
{
e.printStackTrace();
}
return null;
}
}