Uso de Java y diferencia de BeanUtils.copyProperties y PropertyUtils.copyProperties

1. Introducción

BeanUtils proporciona paquetes para la API de reflexión e introspección de Java. Su objetivo principal es utilizar el mecanismo de reflexión para procesar las propiedades de JavaBean. Sabemos que un JavaBean generalmente contiene una gran cantidad de atributos. En muchos casos, el procesamiento de JavaBean hace que se acumule una gran cantidad de códigos get / set, lo que aumenta la longitud del código y la dificultad de leer el código. Necesita el soporte del paquete de colecciones y el paquete de registro.

 

Segundo, uso

BeanUtils es una clase de herramienta más utilizada en este paquete, aquí solo se introduce su método copyProperties (). El método se define de la siguiente manera (la fuente se asigna al destino)

public static void copyProperties(Object source, Object target)
 throws java.lang.IllegalAccessException, java.lang.reflect.InvocationTargetException

Si tiene dos JavaBeans con muchas de las mismas propiedades, una situación muy común es el objeto PO (objeto persistente) en Struts y el ActionForm correspondiente, como Teacher y TeacherForm. En general, construimos un objeto PO desde ActionForm en acción. La forma tradicional es asignar atributos uno por uno usando declaraciones similares a las siguientes:

//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;

//构造Teacher对象
Teacher teacher=new Teacher();

//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());

//持久化Teacher对象到数据库
HibernateDAO.save(teacher);

Después de usar BeanUtils, el código ha cambiado mucho, como se muestra a continuación:

//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;

//构造Teacher对象
Teacher teacher=new Teacher();

//赋值
BeanUtils.copyProperties(teacher,teacherForm);

//持久化Teacher对象到数据库
HibernateDAO.save(teacher);

Si hay atributos con nombres diferentes entre Teacher y TeacherForm, BeanUtils no procesa estos atributos, y el programador debe tratarlos manualmente. Por ejemplo, el Profesor contiene la propiedad modifyDate (esta propiedad registra la última fecha de modificación y no requiere que el usuario la ingrese en la interfaz) y el TeacherForm no tiene esta propiedad, luego agrega una oración después de copyProperties () en el código anterior:

teacher.setModifyDate(new Date());

¡Cómo es conveniente! Además de BeanUtils, hay una clase de herramienta llamada PropertyUtils, que también proporciona el método copyProperties (), que es muy similar al método del mismo nombre en BeanUtils. La principal diferencia es que este último proporciona funciones de conversión de tipo, es decir, los dos JavaBeans tienen la misma propiedad de nombre Para diferentes tipos, la conversión se realiza dentro del rango de tipos de datos admitidos, y el primero no admite esta función, pero la velocidad será más rápida. Los tipos de conversión admitidos por BeanUtils son los siguientes:

* java.lang.BigDecimal * java.lang.BigInteger * boolean and java.lang.Boolean * byte and java.lang.Byte * char and java.lang.Character * java.lang.Class * double and java.lang.Double * float and java.lang.Float * int and java.lang.Integer * long and java.lang.Long * short and java.lang.Short * java.lang.String * java.sql.Date * java.sql.Time * java.sql.Timestamp 

Una cosa a tener en cuenta aquí es que java.util.Date no es compatible, y su subclase java.sql.Date es compatible. Por lo tanto, si el objeto contiene un atributo de tipo de tiempo y desea convertirse, debe usar el tipo java.sql.Date. De lo contrario, generará una excepción de tipo incorrecto de argumento durante la conversión.

 

Tres, ventajas y desventajas.

El proyecto Apache Jakarta Commons es muy útil. He utilizado varios componentes comunes comunes directa o indirectamente en muchos proyectos diferentes. Uno de los componentes poderosos es BeanUtils. Explicaré cómo usar BeanUtils para convertir beans de entidad local en objetos de valor correspondientes:

BeanUtils.copyProperties(aValue, aLocal)

El código anterior copia las propiedades de un objeto Local a un objeto Value. ¡Es bastante simple! No importa cuántos atributos tenga el objeto local (o el valor correspondiente), solo cópielo. Suponemos que el objeto local tiene 100 atributos. El código anterior nos permite evitar largas y propensas a errores y repetidas llamadas al método get y set sin escribir al menos 100 líneas. ¡Esto es asombroso! Demasiado poderoso! ¡Es muy útil!

Ahora, están las malas noticias: ¡el costo de usar BeanUtils es sorprendentemente caro! Hice una prueba simple: BeanUtils tomó más tiempo que buscar datos, copiarlos en el objeto de valor correspondiente (llamando manualmente a métodos get y set) y devolverlos al cliente remoto a través de la serialización. La suma del tiempo. ¡Así que ten cuidado al usar este poder!

952 artículos originales publicados · elogiado 1820 · 890,000 vistas

Supongo que te gusta

Origin blog.csdn.net/Dream_Weave/article/details/105374400
Recomendado
Clasificación