Heim > Java > javaLernprogramm > Ausführliche Erläuterung des Beispiel-Tutorials zur Objektreplikation von Apache

Ausführliche Erläuterung des Beispiel-Tutorials zur Objektreplikation von Apache

零下一度
Freigeben: 2017-06-30 09:55:01
Original
1814 Leute haben es durchsucht

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

Bei der Verwendung von BeanUtils sind mehrere Dinge zu beachten:

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]
Nach dem Login kopieren
Code anzeigen
erklärt, dass es bei der Typkonvertierung zu Problemen kommen kann, da diese Typen entsprechende Grundtypen haben Eine Konvertierung ähnlich wie Integer -> int. Zu diesem Zeitpunkt ist es offensichtlich, dass dem Attribut vom Typ int kein Wert von Null zugewiesen werden kann, sodass es einheitlich in 0 konvertiert wird.

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);
Nach dem Login kopieren
Code anzeigen
2. BigDecimal/java Wenn der Wert für die Klassen .sql.Date/java.sql.Timestamp/java.sql.Time null ist, wird beim Kopieren eine Ausnahme ausgelöst und der entsprechende Conveter muss verwendet werden:

 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);
Nach dem Login kopieren
Code anzeigen
Angenommen, er wird von A nach B kopiert:
Anforderung 1: Wenn ein Feld in B einen Wert hat (nicht null), dann wird das Feld nicht kopiert; das heißt, das Kopieren wird nur durchgeführt, wenn das Feld in B keinen Wert hat, was zum Ergänzen von B mit Wert geeignet ist.


 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 }
Nach dem Login kopieren
Anforderung 2: Wenn ein Feld in A keinen Wert hat (null ist), wird das Feld nicht kopiert , das heißt Kopieren Sie null nicht in 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 }
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage