几种Bean的复制方法性能比较
2017-07-19 22:37
459 查看
由于项目对性能 速度要求很高,表中的字段也很多,存在一个复制方法,耗时相对比较长,经过测试,使用Apache,Spring等提供的方法 耗时较长,使用自己自定义的复制方法时间提升很多,现记录下。
1.pom.xml
View Code
2.定义一个实体bean
3.自己定义的bean复制方法
4.各种bean复制方法的比较
5.运行结果展示
自定义的复制方法,使用了Java的反射机制实现,虽然其他的方法也是通过反射实现。但是自己定义的耗时时间最少,记录下,以备后用。
6.源码下载
https://git.oschina.net/xbq8023/copy-property.git
1.pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xsjt.compare</groupId> <artifactId>copy-property</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <!-- apache --> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.8.RELEASE</version> </dependency> <!-- cglib --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.3</version> </dependency> <!-- ezmorph --> <dependency> <groupId>net.sf.ezmorph</groupId> <artifactId>ezmorph</artifactId> <version>1.0.6</version> </dependency> </dependencies> </project>
View Code
2.定义一个实体bean
package com.xsjt.bean; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; /** * 用户实体类 * @author Administrator * */ @SuppressWarnings("serial") public class User implements Serializable{ private int id; private String userName; private String userPass; private String phone; private Date birth; private BigDecimal totleMoney; private String remark; public User() { super(); } public User(int id, String userName, String userPass, String phone, Date birth, BigDecimal totleMoney, String remark) { super(); this.id = id; this.userName = userName; this.userPass = userPass; this.phone = phone; this.birth = birth; this.totleMoney = totleMoney; this.remark = remark; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPass() { return userPass; } public void setUserPass(String userPass) { this.userPass = userPass; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public BigDecimal getTotleMoney() { return totleMoney; } public void setTotleMoney(BigDecimal totleMoney) { this.totleMoney = totleMoney; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } @Override public String toString() { return "User [id=" + id + ", userName=" + userName + ", userPass=" + userPass + ", phone=" + phone + ", birth=" + birth + ", totleMoney=" + totleMoney + ", remark=" + remark + "]"; } }
3.自己定义的bean复制方法
package com.xsjt.util; import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Date; import com.xsjt.bean.User; /** * ClassName:CopyBeanProperty * 在对象之间 进行属性值 复制 * Date: 2017年7月19日 下午5:53:07 * @author Joe * @version * @since JDK 1.8 */ public class CopyBeanProperty { /** * 将 旧的bean的值 赋值 给 新的bean * @param oldObj * @param newObj */ public static void copyproperty(Object oldObj ,Object newObj){ Class<?> clz = oldObj.getClass(); Field[] cols = clz.getDeclaredFields(); String name = null; Object value = null; try { for(Field col : cols){ if(!col.isAccessible()){ // 设置可访问 col.setAccessible(true); } name = col.getName(); value = col.get(oldObj); // 赋值给 新的bean setBeanProperty(name ,value ,newObj); } } catch (Exception e) { e.printStackTrace(); } } /** * 将 name 和 value 赋值给 新的bean * @param name * @param value * @param newObj * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalAccessException * @throws IllegalArgumentException */ private static void setBeanProperty(String name, Object value, Object newObj) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { Class<?> clz = newObj.getClass(); Field col = clz.getDeclaredField(name); if(!col.isAccessible()){ // 设置可访问 col.setAccessible(true); } col.set(newObj, value); } /** * 循环输入 属性 和 值 ,测试的 时候 使用 * @param newObj * @throws IllegalAccessException * @throws IllegalArgumentException */ private static void loopBeanProperty(Object newObj) throws IllegalArgumentException, IllegalAccessException{ Class<?> clz = newObj.getClass(); Field[] cols = clz.getDeclaredFields(); for(Field col : cols){ if(!col.isAccessible()){ // 设置可访问 col.setAccessible(true); } System.out.println(col.getName() + "-->" + col.get(newObj)); } } /** * 测试 * @param args */ public static void main(String[] args) { User user = new User(1, "admin", "12345", "135555555555", new Date(), new BigDecimal(20000.88), "土豪"); try { loopBeanProperty(user); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }
4.各种bean复制方法的比较
package com.xsjt.compare; import java.math.BigDecimal; import java.util.Date; import org.apache.commons.beanutils.BeanUtils; import com.xsjt.bean.User; import com.xsjt.util.CopyBeanProperty; import net.sf.cglib.beans.BeanCopier; import net.sf.ezmorph.MorpherRegistry; import net.sf.ezmorph.bean.BeanMorpher; /** * ClassName:CompareTest * 测试 各种 复制 方法的性能 * Date: 2017年7月19日 下午5:53:07 * @author Joe * @version * @since JDK 1.8 */ public class CompareTest { public static void main(String[] args) throws Exception { // 1.使用 apache 的 复制 方法 User orig = new User(1, "admin", "12345", "135555555555", new Date(), new BigDecimal(20000.88), "土豪"); User dest = new User(); long start = System.currentTimeMillis(); BeanUtils.copyProperties(dest, orig); System.out.println("1.apache的方法 花费的时间:" + (System.currentTimeMillis() - start) + "ms"); System.out.println("dest==" + dest); System.out.println("--------------------------------我是分割线------------------------------------------------"); // 2.使用 spring 的 复制方法 User source = new User(1, "admin", "12345", "135555555555", new Date(), new BigDecimal(20000.88), "土豪"); User target = new User(); start = System.currentTimeMillis(); org.springframework.beans.BeanUtils.copyProperties(source, target); System.out.println("2.spring的方法 花费的时间:" + (System.currentTimeMillis() - start) + "ms"); System.out.println("target==" + target); System.out.println("--------------------------------我是分割线------------------------------------------------"); // 3.使用 cglib 的复制方法 User source2 = new User(1, "admin", "12345", "135555555555", new Date(), new BigDecimal(20000.88), "土豪"); User target2 = new User(); start = System.currentTimeMillis(); BeanCopier.create(source2.getClass(), target2.getClass(), false).copy(source2, target2, null); System.out.println("3.cglib的方法 花费的时间:" + (System.currentTimeMillis() - start) + "ms"); System.out.println("target2==" + target2); System.out.println("--------------------------------我是分割线------------------------------------------------"); // 4.使用 EZMorph 的复制方法 User source3 = new User(1, "admin", "12345", "135555555555", new Date(), new BigDecimal(20000.88), "土豪"); User target3 = new User(); start = System.currentTimeMillis(); MorpherRegistry registry = new MorpherRegistry(); registry.registerMorpher(new BeanMorpher(User.class, registry)); target3 = (User) registry.morph(User.class, source3); System.out.println("4.EZMorph的方法 花费的时间:" + (System.currentTimeMillis() - start) + "ms"); System.out.println("target3==" + target3); System.out.println("--------------------------------我是分割线------------------------------------------------"); // 5.使用 自定义 的复制方法 User oldUser = new User(1, "admin", "12345", "135555555555", new Date(), new BigDecimal(20000.88), "土豪"); User newUser = new User(); start = System.currentTimeMillis(); CopyBeanProperty.copyproperty(oldUser, newUser); System.out.println("5.自定义的方法 花费的时间:" + (System.currentTimeMillis() - start) + "ms"); System.out.println("newUser==" + newUser); } }
5.运行结果展示
自定义的复制方法,使用了Java的反射机制实现,虽然其他的方法也是通过反射实现。但是自己定义的耗时时间最少,记录下,以备后用。
6.源码下载
https://git.oschina.net/xbq8023/copy-property.git
相关文章推荐
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
- ArcEngine数据删除几种方法和性能比较
- ArcEngine数据删除几种方法和性能比较[转]
- ArcEngine数据删除几种方法和性能比较[转]
- 【原】检测是否包含特定字符串的几种方法以及性能比较
- ArcEngine数据删除几种方法和性能比较【转载】
- ArcEngine,C#数据删除几种方法以及性能比较
- python获取字母在字母表对应位置的几种方法及性能对比较
- ArcEngine数据删除几种方法和性能比较【转载】
- ArcEngine数据删除几种方法和性能比较【转载】
- java 几种保留小数位数的方法性能比较