BeanUtils.copyProperties und PropertyUtils.copyProperties
Beide Toolklassen verarbeiten Eigenschaften mit demselben Namen, die zuvor in zwei Beans vorhanden waren, unabhängig davon, ob es sich um die Quell-Bean oder die Ziel-Bean handelt der Attribute verarbeitet werden.
Das Prinzip besteht darin, den Reflexionsmechanismus von JDK dynamisch abzurufen und festzulegen, um unsere Klassen zu konvertieren.
Aber Sie sollten auf die von ihnen unterstützten Datentypen achten. Eine andere Sache ist, dass die Konvertierung einer solchen Klasse nicht erfolgreich sein wird, wenn sie in eine Klasse geschrieben wird, die normalerweise als innere Klasse bezeichnet wird.
Der größte Unterschied zwischen den beiden ist:
1.BeanUtils.copyProperties führt eine Typkonvertierung durch, PropertyUtils.copyProperties jedoch nicht.
Da die Typkonvertierung durchgeführt wird, ist BeanUtils.copyProperties nicht so schnell wie PropertyUtils.copyProperties.
Daher ist der Anwendungsbereich von PropertyUtils.copyProperties etwas enger. Es kopiert nur Eigenschaften mit demselben Namen und Typ. Wenn der Name gleich ist, der Typ jedoch unterschiedlich ist, wird ein Fehler gemeldet.
2. Handhabung von Null: PropertyUtils unterstützt Nullszenarien für einige Eigenschaften, insbesondere wie folgt:
1), Datumstyp wird nicht unterstützt 2),
Boolean, Ineger, Long, Short, Float, Double usw. werden nicht unterstützt: auf false setzen, 0; 3), string: unterstützt, null behalten; >
1 Für Attribute vom Typ Boolean/Short/Integer/Float/Double wird es in false, 0, konvertiert :
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]
Wie kann verhindert werden, dass es auf 0 geht? Es kann so sein:
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 }
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung des Beispiel-Tutorials zur Objektreplikation von Apache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!