使用字节码asm将pojo转换成Map,直接构造mongodb bsonobject
2013-10-18 14:17
489 查看
package com.skmbw.yinlei.mongo; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.commons.lang3.StringUtils; import org.springframework.cglib.beans.BeanMap; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.esotericsoftware.reflectasm.MethodAccess; public class JSONUtils { public static ConcurrentMap<String, BeanMap> beanMapCache = new ConcurrentHashMap<String, BeanMap>(); //JSONObject就是个Map,它实现了Map接口 public static Map<String, ?> toMap(Object object) { JSONObject jsonObject = (JSONObject)JSON.toJSON(object); return jsonObject; } //去掉null,最差 public static Map<String, ?> toMaps(Object object) { Map<String, Object> map = new HashMap<String, Object>(); JSONObject jsonObject = (JSONObject) JSON.toJSON(object); for (Entry<String, Object> entry : jsonObject.entrySet()) { if (entry.getValue() != null) { map.put(entry.getKey(), entry.getValue()); } } return map; } public static void main(String[] aa) { User user = new User(); user.setAccount("asdf"); user.setAge(22); user.setDate(new Date()); Map<String, Object> result = new HashMap<String, Object>(); Map<String, Object> result2 = new HashMap<String, Object>(); long d2 = System.nanoTime(); JSONObject jsonObject = (JSONObject)JSON.toJSON(user); String json = jsonObject.toJSONString(); Map<String, Object> jsonMap = JSON.parseObject(json); System.out.println(System.nanoTime() - d2); long dd = System.nanoTime(); Map<String, Object> map = (Map<String, Object>)jsonObject; result.putAll(map); System.out.println(System.nanoTime() - dd); long d = System.nanoTime(); for (Entry<String, Object> entry : jsonObject.entrySet()) { if (entry.getValue() != null) { result2.put(entry.getKey(), entry.getValue()); } } System.out.println(System.nanoTime() - d); Map<String, Object> toMap = new HashMap<String, Object>(); beanToMap(user, toMap); Map<String, Object> toMap2 = beanToMap(user); System.out.println(toMap2); } //性能次之 public static void beanToMap(Object fromBean, Map<String, Object> toMap) { //MethodAccess要缓存 MethodAccess methodAccess = MethodAccess.get(fromBean.getClass()); String[] methodNames = methodAccess.getMethodNames(); for (String methodName : methodNames){ if (methodName.startsWith("get")){ Object value = methodAccess.invoke(fromBean, methodName, (Object[])null); toMap.put(StringUtils.uncapitalize(methodName.substring(3)), value); } } } public static BeanMap getBeanMap(Object object) { BeanMap beanMap = beanMapCache.get(object.getClass().getName()); if (beanMap == null) { beanMap = BeanMap.create(object); beanMapCache.put(object.getClass().getName(), beanMap); } return beanMap; } //如果使用BeanMap缓存,这个性能最好。 public static Map<String, Object> beanToMap(Object object) { BeanMap beanMap = getBeanMap(object); beanMap.setBean(object); @SuppressWarnings("unchecked") Map<String, Object> toMap = beanMap; for (Entry<String, Object> entry : toMap.entrySet()) { if (entry.getValue() != null) { toMap.put(entry.getKey(), entry.getValue()); } } return toMap; } }
因为mongodb的bosnobject,有一个putAll(Map)的方法,可以快速构建BsonObject。
相关文章推荐
- PHP添加yaf xhprof mongodb 同理
- mongodb安装
- Android使用Google Map浅谈
- fastjson处理接口时的一个问题
- ASP JSON类文件的使用方法
- wap开发中如何有效的利用缓存减少消息的传送量
- PHP6 先修班 JSON实例代码
- 引用全局程序集缓存内的程序集的方法
- asp Response.flush 实时显示进度
- ASP.NET缓存管理的几种方法
- jquery中ajax调用json数据的使用说明
- jquery与google map api结合使用 控件,监听器
- JQuery 解析多维的Json数据格式
- Ajax与JSON的一些学习总结
- JQuery将文本转化成JSON对象需要注意的问题
- jQuery 中使用JSON的实现代码
- Ajax获取页面被缓存的解决方法
- 用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
- ASP.NET网站管理系统退出 清除浏览器缓存,Session的代码
- js实现json数据行到列的转换的实例代码