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]
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: 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 }
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!