`
jacky2007
  • 浏览: 169188 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

重写BeanUtils.copyProperties(复制对象属性方法)

    博客分类:
  • JAVA
阅读更多

复制对象属性时用到apache common-beanutils这个工具包中的

BeanUtils.copyProperties

但经测试100W次复制单一属性的对象用了2354豪秒,这是因为通过JDK的method.invoke去反射调用方法复制对象中的属性,用http://code.google.com/p/reflectasm/这个工具包可以提高性能

public class BeanUtils {
	
	private static Map<Class,MethodAccess> methodMap = new HashMap<Class,MethodAccess>();
	
	private static Map<String,Integer> methodIndexMap = new HashMap<String,Integer>();
	
	private static Map<Class,List<String>> fieldMap = new HashMap<Class,List<String>>();

	public static void copyProperties(Object desc,Object orgi){
		MethodAccess descMethodAccess = methodMap.get(desc.getClass());
		if(descMethodAccess == null){
			descMethodAccess = cache(desc);
		}
		MethodAccess orgiMethodAccess = methodMap.get(orgi.getClass());
		if(orgiMethodAccess == null){
			orgiMethodAccess = cache(orgi);
		}
		
		List<String> fieldList = fieldMap.get(orgi.getClass());
		for (String field : fieldList) {
			String getKey = orgi.getClass().getName() + "." + "get" + field;
			String setkey = desc.getClass().getName() + "." + "set" + field;
			Integer setIndex = methodIndexMap.get(setkey);
			if(setIndex != null){
				int getIndex = methodIndexMap.get(getKey);
				descMethodAccess.invoke(desc, setIndex.intValue(), orgiMethodAccess.invoke(orgi, getIndex));
			}
		}
		
		
	}
	
	private static MethodAccess cache(Object orgi){
		synchronized (orgi.getClass()) {
			MethodAccess methodAccess = MethodAccess.get(orgi.getClass()); 
			Field[] fields = orgi.getClass().getDeclaredFields();
			List<String> fieldList = new ArrayList<String>(fields.length);
			for (Field field : fields) {
				if(Modifier.isPrivate(field.getModifiers()) && ! Modifier.isStatic(field.getModifiers())){
					//非公共私有变量
					String fieldName = StringUtils.capitalize(field.getName());
					int getIndex = methodAccess.getIndex("get"+fieldName);
					int setIndex = methodAccess.getIndex("set"+fieldName);
					methodIndexMap.put(orgi.getClass().getName()+"."+"get"+fieldName, getIndex);
					methodIndexMap.put(orgi.getClass().getName()+"."+"set"+fieldName, setIndex);
					fieldList.add(fieldName);
				}
			}
			fieldMap.put(orgi.getClass(),fieldList);
			methodMap.put(orgi.getClass(), methodAccess);
			return methodAccess;
		}
	}
	
	
}

 

用此方法运行100W次,大约用时800毫秒,约相差3倍.

0
0
分享到:
评论
1 楼 白庆周 2015-09-10  
运行不了,报错。

相关推荐

    BeanMapper:比BeanUtils.copyProperties更快

    一个BeanUtils.copyProperties的小型快速替代。 起因 由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在...

    如何使用BeanUtils.copyProperties进行对象之间的属性赋值

    在这个`convertList2List`方法中,我们遍历输入列表(input),为每个元素创建一个新的目标对象实例(target),然后调用`BeanUtils.copyProperties`进行属性复制,最后将新对象添加到输出列表(output)。...

    java Beanutils.copyProperties( )用法详解

    在上面的代码中,我们使用 BeanUtils.copyProperties() 方法将 ActionForm 对象的属性复制到 User 对象中。这样,我们就不需要逐个赋值了,代码也变得更加简洁和易读。 需要注意的是,BeanUtils.copyProperties() ...

    BeanUtilsBean对象复制使用(类型可以自动转化)

    `BeanUtilsBean.getInstance().copyProperties()`方法被用来复制`Source`对象的属性到`Destination`对象。 通过`BeanUtilsBean`进行对象复制,我们可以减少手动赋值的繁琐工作,提高代码的可读性和可维护性。然而,...

    commons-beanutils.jar.zip

    1. **属性拷贝**:BeanUtils.copyProperties()方法可以实现两个JavaBean对象之间的属性值拷贝,极大地减少了代码量。 2. **动态属性访问**:通过BeanUtils.getProperty()和BeanUtils.setProperty(),我们可以动态地...

    org.apache.commons.beanutils.jar

    3. **复制属性**:`copyProperties()`方法允许在两个JavaBean对象之间复制属性,极大地简化了数据迁移或对象克隆的过程。 4. **集合操作**:BeanUtils还提供了处理集合的方法,如`convert()`,可以将一个集合中的...

    [] - 2022-11-22 使用 BeanUtils.copyProperties 踩坑经历.pdf

    互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...

    BeanUtils.jar

    1. **属性复制**:BeanUtils.copyProperties()是其最常用的功能之一,它能将一个对象的所有属性值复制到另一个对象中,大大减少了手动赋值的工作。 2. **类型转换**:BeanUtils.setProperty()和BeanUtils....

    commons-beanutils-1.8.0.jar beanutils.jar beanutils.jar工具包

    commons-beanutils-1.8.0.jar beanutils.jar beanutils.jar工具包

    使用BeanUtils操作属性的一个小坑

    例如,我们可以使用`BeanUtils.copyProperties()`方法快速地将一个JavaBean的属性值复制到另一个JavaBean上。但请注意,这种方法默认会忽略源对象中不存在于目标对象的属性,而目标对象中未在源对象中找到的属性将...

    commons-beanutils.jar

    在上面的例子中,我们看到通过调用`BeanUtils.copyProperties()`,源对象User的属性值被复制到了目标对象。 4. **注意事项** - BeanUtils操作的是public属性,对于private属性,需要对应的getter和setter方法。 ...

    commons-beanutils.jar下载

    commons-beanutils.jar commons-beanutils.jar

    commons.jar +commons-beanutils.jar

    它包括对属性的读写、复制Bean的功能,以及对集合和Map的便捷处理,使得开发者能够更加容易地处理Java对象的属性。 **其他压缩包文件**: 1. **commons-collections-2.1.1.jar**:这是Apache Commons Collections...

    commons-beanutils-1.9.4.jar.zip

    5. **拷贝属性**:`BeanUtils.copyProperties()`方法可以实现对象间的属性深度拷贝,这对于创建对象副本或者在不同对象间传递数据十分便利。 6. **避免空指针异常**:BeanUtils库在处理null值时会进行保护,避免因...

    自动装配Beanutils.zip

    `BeanUtils` 是Apache Commons项目中的一个工具库,提供了大量实用方法,尤其是用于对象属性的设置和复制。它利用Java的反射机制,可以方便地将请求参数自动装配到对应的Java Bean中,极大地简化了开发者的工作。 ...

    org.apache.commons.beanutils.BeanUtils实例

    此为BeanUtils的实例。其中apache的包有一个小的BUG已在其中说明。

    json用到的jar包(commons-beanutils.jar、commons-collections-3.1.jar等)

    json相关jar包(不使用springmvc开发时)。其中包含(commons-beanutils.jar、commons-collections-3.1.jar、commons-lang-2.6.jar、commons-logging.jar、ezmorph-1.0.6.jar、json-lib-2.2.3-jdk15.jar)

Global site tag (gtag.js) - Google Analytics