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
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]
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);
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 }
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!