使用字节码asm将pojo转换成Map,直接构造mongodb bsonobject

本文介绍了一种高效地将Java对象转换为适合MongoDB存储的Map结构的方法,并对比了几种不同实现方式的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值