ホームページ >Java >&#&チュートリアル >Apacheのオブジェクトレプリケーションサンプルチュートリアルの詳細な説明

Apacheのオブジェクトレプリケーションサンプルチュートリアルの詳細な説明

零下一度
零下一度オリジナル
2017-06-30 09:55:011833ブラウズ

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]

コードを見る

では、これらの型には対応する基本型があり、型変換はこのとき、Integer -> int のような変換が行われる可能性があります。このとき、int 型の属性には null の値を割り当てることができないため、一律に 0 に変換されます。
0にならないようにするにはどうすればよいですか?次のようになります:

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);

コードの表示

2. クラス java.util.Date/BigDecimal/java.sql.Date/java.sql.Timestamp/java.sql.Time の場合、 if 値が null の場合、コピー時に例外がスローされ、対応する Conveter を使用する必要があります:
 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);
コードの表示

A から B にコピーされると仮定します:
要件 1: B のフィールドに値がある (null ではない) 場合、フィールドはコピーされません。つまり、B のフィールドに値がない場合にのみコピーされます。これは、B の値を補足するのに適しています。
 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 }


要件 2: A のフィールドに値がない (null である) 場合、フィールドはコピーされません。つまり、null を B にコピーしません。
りー

以上がApacheのオブジェクトレプリケーションサンプルチュートリアルの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。