使用字節碼asm將pojo轉換成Map,直接構造mongodb bsonobject

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。

發佈了62 篇原創文章 · 獲贊 9 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章