Maison  >  Article  >  Java  >  Explication détaillée du didacticiel d'exemple de réplication d'objets d'Apache

Explication détaillée du didacticiel d'exemple de réplication d'objets d'Apache

零下一度
零下一度original
2017-06-30 09:55:011762parcourir

BeanUtils.copyProperties et PropertyUtils.copyProperties

Les deux classes d'outils traitent les propriétés portant le même nom qui existaient auparavant dans deux beans, qu'il s'agisse du bean source ou du bean cible. des attributs sont traités.

Le principe est d'obtenir et de définir dynamiquement via le mécanisme de réflexion du JDK pour convertir nos classes.

Mais vous devez faire attention aux types de données qu'ils prennent en charge. Une autre chose est que si une classe est écrite dans une classe, généralement appelée classe interne, la conversion d'une telle classe ne réussira pas.

La plus grande différence entre les deux est :
1.BeanUtils.copyProperties effectuera la conversion de type, mais pas PropertyUtils.copyProperties.
Puisque la conversion de type est effectuée, BeanUtils.copyProperties n'est pas aussi rapide que PropertyUtils.copyProperties.
Par conséquent, le champ d'application de PropertyUtils.copyProperties est légèrement plus étroit. Il copie uniquement les propriétés avec le même nom et le même type. Si le nom est le même mais le type est différent, il signalera une erreur.

2. Gestion de null : PropertyUtils prend en charge les scénarios nuls ; BeanUtils ne prend pas en charge les scénarios nuls pour certaines propriétés, notamment les suivantes :

1), le type de date n'est pas pris en charge ; 🎜>2),
Booléen, Ineger, Long, Short, Float, Double, etc. ne sont pas pris en charge : passer à false, 0 ; 3), chaîne : prise en charge, conserver

Il y a plusieurs choses à noter lors de l'utilisation de BeanUtils :

1 Pour les attributs de type Boolean/Short/Integer/Float/Double, il sera converti en 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]
Voir le code
explique que, comme ces types ont des types de base correspondants, lors de la conversion de type, il est possible de rencontrer une conversion similaire à Integer -> int. À l'heure actuelle, il est évident que l'attribut de type int ne peut pas se voir attribuer une valeur nulle, il est donc uniformément converti en 0.

Comment éviter qu'il ne tourne à 0 ? Cela peut être comme ceci :

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);
Afficher le code
2 pour java.util.Date/. BigDecimal/java Pour les classes .sql.Date/java.sql.Timestamp/java.sql.Time, si la valeur est nulle, une exception sera levée lors de la copie, et le Conveter correspondant devra être utilisé :

 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);
Afficher le code
Supposons qu'il soit copié de A à B :
Exigence 1 : Si un champ dans B a une valeur (non null), alors le champ n'est pas copié ; c'est-à-dire que la copie n'est effectuée que lorsque le champ dans B n'a pas de valeur, ce qui convient pour compléter B avec une valeur.


 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 }
Exigence 2 : Si un champ dans A n'a aucune valeur (est nul), alors le champ ne sera pas copié , c'est-à-dire Ne copiez pas null dans B.

 1 import org.apache.commons.beanutils.BeanUtilsBean;  
 2    3 public class CopyFromNotNullBeanUtilsBean extends BeanUtilsBean {  
 4    5     @Override  
 6     public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException {  
 7         if (value == null) {  
 8             return;  
 9         }  
10         super.copyProperty(bean, name, value);  
11     }  
12 }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn