> Java > java지도 시간 > Apache의 객체 복제 예제 튜토리얼에 대한 자세한 설명

Apache의 객체 복제 예제 튜토리얼에 대한 자세한 설명

零下一度
풀어 주다: 2017-06-30 09:55:01
원래의
1785명이 탐색했습니다.

BeanUtils.copyProperties 및 PropertyUtils.copyProperties

두 도구 클래스 모두 이전에 두 Bean에 존재했던 동일한 이름의 속성을 처리하고 소스 Bean 또는 대상 Bean의 추가 속성은 처리하지 않습니다.

JDK의 반사 메커니즘을 통해 동적으로 가져오고 설정하여 클래스를 변환하는 것이 원칙입니다.

하지만 지원하는 데이터 유형에 주의해야 합니다. 또 다른 점은 클래스가 일반적으로 내부 클래스라고 불리는 클래스 내부에 작성되면 해당 클래스의 변환이 성공하지 못한다는 것입니다.

둘 사이의 가장 큰 차이점은 다음과 같습니다.
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로 변환, 3), 문자열: 지원, null 유지

BeanUtils를 사용할 때 주의해야 할 사항이 몇 가지 있습니다: 1. 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]
로그인 후 복사
View Code
는 이러한 유형에 해당하는 기본 유형이 있고 유형 변환이 가능하기 때문이라고 설명합니다. 이때 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 클래스의 경우, 값이 null인 경우 복사 시 예외가 발생하며 해당 변환기를 사용해야 합니다.

 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에 복사하지 마십시오.

 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 }
로그인 후 복사

위 내용은 Apache의 객체 복제 예제 튜토리얼에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿