BeanUtils、PropertyUtils、Dozer


テスト例:
package com.cn.copy.service;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;

import com.cn.copy.vo.Middle;
import com.cn.copy.vo.MiddleDto;

public class Test {
	
	public static void testMapObjectToObject(int count) {
		Middle m1 = new Middle();
		m1.setFlag(true);
		m1.setId(1000L);
		m1.setItem(new int[] { 10, 20, 30 });
		m1.setPrice(12.33);
		m1.setType("hahaha!");
		m1.setDate(new Date());
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < count; i++) {
			MiddleDto mg = new MiddleDto();
			VoPoConverter.copyProperties(mg, m1);
		}
		System.out.println("DozerBeanMapper-time1:"
				+ (System.currentTimeMillis() - t1));
	}

	public static void testPropertyCopyObjectObject(int count) {
		Middle m1 = new Middle();
		m1.setFlag(true);
		m1.setId(1000L);
		m1.setItem(new int[] { 10, 20, 30 });
		m1.setPrice(12.33);
		m1.setType("hahaha!");
		m1.setDate(new Date());
		long t1 = System.currentTimeMillis();

		for (int i = 0; i < count; i++) {
			MiddleDto mg = new MiddleDto();
			try {
				PropertyUtils.copyProperties(mg, m1);
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("PropertyUtils-time2:"
				+ (System.currentTimeMillis() - t1));
	}

	public static void testBeanCopyObjectObject(int count) {
		Middle m1 = new Middle();
		m1.setFlag(true);
		m1.setId(1000L);
		m1.setItem(new int[] { 10, 20, 30 });
		m1.setPrice(12.33);
		m1.setType("hahaha!");
		m1.setDate(new Date());
		long t1 = System.currentTimeMillis();

		for (int i = 0; i < count; i++) {
			MiddleDto mg = new MiddleDto();
			try {
				BeanUtils.copyProperties(mg, m1);
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		System.out.println("BeanUtils-time3:"
				+ (System.currentTimeMillis() - t1));
	}
	
	public static void main(String[] args) {
		int total = 10000;
		Test.testMapObjectToObject(total);
		Test.testPropertyCopyObjectObject(total);
		Test.testBeanCopyObjectObject(total);
	}
}

1000回の実行結果:
DozerBeanMapper-time1:306
PropertyUtils-time2:30
BeanUtils-time3:42

100000回の実行結果:
DozerBeanMapper-time1:2904
PropertyUtils-time2:1155
BeanUtils-time3:2663

1000000回の実行結果:
DozerBeanMapper-time1:26588
PropertyUtils-time2:11454
BeanUtils-time3:26315

 
テスト結果:
1、万回以内の効率beanutilsはdozerより速い
2、10万回以上の効率beanutilsの効率とdozerの差は多くない.
3、以上は基本タイプのみを考慮して比較したもので、dozerがコピーを深くコピーしたり、関連付けたりすると、効率が遅くなるはずです.
4、PropertyUtilsとBeanUtilsの機能は基本的に一致している.唯一の違いは、BeanUtilsはBeanに値を割り当てるとタイプ変換を行うが、PropertyUtilsはタイプ変換を行わず、タイプが異なると異常を投げ出すことである.これは、PropertyUtilsの効率が他の2つよりも高い理由を説明することができます.
推奨:基本タイプはソースターゲットタイプが一致する場合に使用します:PropertyUtilsの方が効率的です.複雑なタイプのコピーは、Dozerを使用できます.