复制对象属性时用到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倍.
分享到:
相关推荐
一个BeanUtils.copyProperties的小型快速替代。 起因 由于BeanUtils(Spring或Apache Commons)的copyProperties实现是利用反射实现的,它在大量调用时具有比较严重的性能问题。 BeanMapper通过javassist类库实现在...
在这个`convertList2List`方法中,我们遍历输入列表(input),为每个元素创建一个新的目标对象实例(target),然后调用`BeanUtils.copyProperties`进行属性复制,最后将新对象添加到输出列表(output)。...
在上面的代码中,我们使用 BeanUtils.copyProperties() 方法将 ActionForm 对象的属性复制到 User 对象中。这样,我们就不需要逐个赋值了,代码也变得更加简洁和易读。 需要注意的是,BeanUtils.copyProperties() ...
`BeanUtilsBean.getInstance().copyProperties()`方法被用来复制`Source`对象的属性到`Destination`对象。 通过`BeanUtilsBean`进行对象复制,我们可以减少手动赋值的繁琐工作,提高代码的可读性和可维护性。然而,...
1. **属性拷贝**:BeanUtils.copyProperties()方法可以实现两个JavaBean对象之间的属性值拷贝,极大地减少了代码量。 2. **动态属性访问**:通过BeanUtils.getProperty()和BeanUtils.setProperty(),我们可以动态地...
3. **复制属性**:`copyProperties()`方法允许在两个JavaBean对象之间复制属性,极大地简化了数据迁移或对象克隆的过程。 4. **集合操作**:BeanUtils还提供了处理集合的方法,如`convert()`,可以将一个集合中的...
互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...
1. **属性复制**:BeanUtils.copyProperties()是其最常用的功能之一,它能将一个对象的所有属性值复制到另一个对象中,大大减少了手动赋值的工作。 2. **类型转换**:BeanUtils.setProperty()和BeanUtils....
commons-beanutils-1.8.0.jar beanutils.jar beanutils.jar工具包
例如,我们可以使用`BeanUtils.copyProperties()`方法快速地将一个JavaBean的属性值复制到另一个JavaBean上。但请注意,这种方法默认会忽略源对象中不存在于目标对象的属性,而目标对象中未在源对象中找到的属性将...
在上面的例子中,我们看到通过调用`BeanUtils.copyProperties()`,源对象User的属性值被复制到了目标对象。 4. **注意事项** - BeanUtils操作的是public属性,对于private属性,需要对应的getter和setter方法。 ...
commons-beanutils.jar commons-beanutils.jar
它包括对属性的读写、复制Bean的功能,以及对集合和Map的便捷处理,使得开发者能够更加容易地处理Java对象的属性。 **其他压缩包文件**: 1. **commons-collections-2.1.1.jar**:这是Apache Commons Collections...
5. **拷贝属性**:`BeanUtils.copyProperties()`方法可以实现对象间的属性深度拷贝,这对于创建对象副本或者在不同对象间传递数据十分便利。 6. **避免空指针异常**:BeanUtils库在处理null值时会进行保护,避免因...
`BeanUtils` 是Apache Commons项目中的一个工具库,提供了大量实用方法,尤其是用于对象属性的设置和复制。它利用Java的反射机制,可以方便地将请求参数自动装配到对应的Java Bean中,极大地简化了开发者的工作。 ...
此为BeanUtils的实例。其中apache的包有一个小的BUG已在其中说明。
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)