`
zjmfeeling
  • 浏览: 23297 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

map和java对象转换

 
阅读更多

利用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);
	}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics