BeanUtils.copyProperties と PropertyUtils.copyProperties
どちらのツール クラスも、2 つの Bean に以前に存在していた同じ名前のプロパティを処理し、ソース Bean またはターゲット Bean の追加のプロパティは処理しません。
原則は、JDK のリフレクション メカニズムを通じて動的に取得および設定してクラスを変換することです。
しかし、サポートされるデータ型に注意する必要があります。もう 1 つは、クラスが通常内部クラスと呼ばれるクラス内に記述されている場合、そのようなクラスの変換は成功しないということです。
2 つの最大の違いは、
1.BeanUtils.copyProperties は型変換を実行しますが、PropertyUtils.copyProperties は実行しません。
型変換が実行されるため、BeanUtils.copyProperties は PropertyUtils.copyProperties ほど高速ではありません。
そのため、PropertyUtils.copyProperties の適用範囲は少し狭くなります。名前と型が同じで、型が異なるプロパティのみをコピーします。
2. null の処理: PropertyUtils は null シナリオをサポートします。BeanUtils は、特に次のような一部のプロパティについては null シナリオをサポートしません:
1)、
Boolean、Ineger、Long。 、Short、Float、Double などはサポートされていません: false に変換、0; 3)、文字列: サポートされており、null を維持します。 BeanUtils を使用する場合は、いくつかの注意事項があります。の型の場合、Boolean/Short/Integer/Float/Double のプロパティは false または 0 に変換されます:
1 public class User { 2 3 private Integer intVal; 4 5 private Double doubleVal; 6 7 private Short shortVal; 8 9 private Long longVal; 10 11 private Float floatVal; 12 13 private Byte byteVal; 14 15 private Boolean booleanVal; 16 } 17 18 User src = new User(); 19 User dest = new User(); 20 BeanUtils.copyProperties(dest, src); 21 System.out.println(src); 22 System.out.println(dest); 23 24 //输出结果: 25 User [intVal=null, doubleVal=null, shortVal=null, longVal=null, floatVal=null, byteVal=null, booleanVal=null] 26 User [intVal=0, doubleVal=0.0, shortVal=0, longVal=0, floatVal=0.0, byteVal=0, booleanVal=false]
コードを見る
1 import org.apache.commons.beanutils.converters.IntegerConverter; 2 3 IntegerConverter converter = new IntegerConverter(null); //默认为null,而不是0 4 BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); 5 beanUtilsBean.getConvertUtils().register(converter, Integer.class);
コードの表示
1 public class User2 { 2 3 private java.util.Date javaUtilDateVal; 4 5 private java.sql.Date javaSqlDateVal; 6 7 private java.sql.Timestamp javaSqlTimeStampVal; 8 9 private BigDecimal bigDecimalVal; 10 11 private java.sql.Time javaSqlTime; 12 13 } 14 15 User2 src = new User2(); 16 User2 dest = new User2(); 17 18 BeanUtilsBean beanUtilsBean = new BeanUtilsBean(); 19 20 //如果没有下面几行,则在转换null时会抛异常,例如:org.apache.commons.beanutils.ConversionException: No value specified for 'BigDecimal' 21 //在org.apache.commons.beanutils.converters这个包下面有很多的Converter,可以按需要使用 22 beanUtilsBean.getConvertUtils().register(new BigDecimalConverter(null), BigDecimal.class); 23 beanUtilsBean.getConvertUtils().register(new DateConverter(null), java.util.Date.class); 24 25 beanUtilsBean.getConvertUtils().register(new SqlTimestampConverter(null), java.sql.Timestamp.class); 26 beanUtilsBean.getConvertUtils().register(new SqlDateConverter(null), java.sql.Date.class); 27 beanUtilsBean.getConvertUtils().register(new SqlTimeConverter(null), java.sql.Time.class); 28 29 beanUtilsBean.copyProperties(dest, src); 30 System.out.println(src); 31 System.out.println(dest);
1 import org.apache.commons.beanutils.BeanUtilsBean; 2 import org.apache.commons.beanutils.PropertyUtils; 3 4 public class CopyWhenNullBeanUtilsBean extends BeanUtilsBean{ 5 6 @Override 7 public void copyProperty(Object bean, String name, Object value) 8 throws IllegalAccessException, InvocationTargetException { 9 try { 10 Object destValue = PropertyUtils.getSimpleProperty(bean, name); 11 if (destValue == null) { 12 super.copyProperty(bean, name, value); 13 } 14 } catch (NoSuchMethodException e) { 15 throw new RuntimeException(e); 16 } 17 } 18 19 }
以上がApacheのオブジェクトレプリケーションサンプルチュートリアルの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。