利用java反射机制实现map和java对象的互相转换
------------------------------------------------------
1)java对象-》map
/**
* @description 接收DTO Object对象,转换成Map类型
* DTO里的属性名称是Map里的key
* @param obj 需要转换的DTO对象
* @return Map
*/
@SuppressWarnings("unchecked")
public static Map dtoToMap(Object obj){
Map map = new HashMap();
if(null != obj ){
Class cla = obj.getClass();
do{
Field[] fields = cla.getDeclaredFields();
for(Field field : fields ){
String name = field.getName();
try {
Method method = cla.getMethod("get"+initCap(name), null);
map.put(name, method.invoke(obj, null));
} catch (Exception e) {
e.printStackTrace();
fields = null;
}
}
//获取父类属性
cla = cla.getSuperclass();
}while(cla != Object.class);
}
return map;
}
/**s
* @description 替换DTO属性名称首字母为大写 如:name-->Name
* @param attr
* @return 大写形式的属性名称
*/
private static String initCap(String attr){
return attr.substring(0, 1).toUpperCase()+attr.substring(1);
}
-----------------------------------------------------
2)map-》java对象
/**
* @description 接收Map和转换目标对象的相对路径,实现Map集合到List的DTO集合的转换
* @param map
* @param className 转换目标对象的相对路径
* @return List
*/
@SuppressWarnings("unchecked")
public static List mapToDto(Map map, String className){
List list = new ArrayList();
if(null != map && null != className && !"".equals(className)){
Iterator iter = map.entrySet().iterator();
Object dto = null;
while(iter.hasNext()){
Map.Entry entry = (Map.Entry)iter.next();
Object obj = entry.getValue();
if(null != obj && obj instanceof Map ){
HashMap m = (HashMap)obj;
try {
Class cla = Class.forName(className);
dto = cla.newInstance();
do{
Field[] fields = cla.getDeclaredFields();
for(Field fiel : fields ){
Object val = m.get(fiel.getName());
if(val != null){
Class type = fiel.getType();
setter(dto, fiel.getName(), getFieldValToObj(val, type.getName()), type);
}
}
cla = cla.getSuperclass();
}while(cla != Object.class);
} catch (Exception e) {
e.printStackTrace();
}
}
list.add(dto);
}
map.clear(); map = null;
}
return list;
}
private static Object getFieldValToObj(Object val, String tName){
if("java.lang.Integer".equals(tName)){
val = Integer.parseInt(val.toString());
}else if("java.lang.Double".equals(tName)){
val = Double.parseDouble(val.toString());
}else if("java.lang.Float".equals(tName)){
val = Float.parseFloat(val.toString());
}else if("java.lang.Long".equals(tName)){
val = Long.parseLong(val.toString());
}else if("java.lang.Boolean".equals(tName)){
val = Boolean.parseBoolean(val.toString());
}else if("java.lang.Byte".equals(tName)){
val = Byte.parseByte(val.toString());
}else if("java.lang.Short".equals(tName)){
val = Short.parseShort(val.toString());
}else if("java.sql.Timestamp".equals(tName)){
Object ts = val;
val = Timestamp.valueOf(ts.toString());
}
return val;
}
/**
* @description 通过反射机制,回调接收的DTO对象,并调用set方法存值
* @param obj DTO实例对象
* @param field DTO对象的属性名
* @param value 属性名称的值
* @param ftype 属性的数据类型
*/
@SuppressWarnings("unchecked")
private static void setter(Object obj, String field, Object value, Class ftype){
try {
Method method = obj.getClass().getMethod("set"+initCap(field), ftype);
method.invoke(obj, value);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @description 转换DTO属性首字母为大写形式 name-->Name
* @param attr 属性名称
* @return 属性名称的大写形式
*/
private static String initCap(String attr){
return attr.substring(0, 1).toUpperCase()+attr.substring(1);
}