2011-05-02 24 views
22

¿Hay alguna forma estándar de acceder a Java Bean propiedad comoBeans Java Reflection API Propiedad

class A { 
    private String name; 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 

} 

Entonces, ¿puedo acceder a este nombre de propiedad de bean Java utilizando la API de reflexión para que cuando cambie el valor de los bienes de los métodos de getNombre y setName se activan automáticamente cuando establecer y obtener valores de dicha propiedad

Respuesta

40

Lo que se necesita es el mecanismo BeanInfo/Introspector (véase la respuesta de Bozho). Sin embargo, es un infierno usar esto directamente, por lo que puede usar una de las bibliotecas que ofrecen acceso basado en propiedades. El más conocido es probablemente Apache Commons/BeanUtils (el otro es de BeanWrapper abstracción Primavera) Código

Ejemplo:

A someBean = new A(); 

// access properties as Map 
Map<String, Object> properties = BeanUtils.describe(someBean); 
properties.set("name","Fred"); 
BeanUtils.populate(someBean, properties); 

// access individual properties 
String oldname = BeanUtils.getProperty(someBean,"name"); 
BeanUtils.setProperty(someBean,"name","Barny"); 
+0

solo para el ignorante (yo), ¿por qué no simplemente llamar a someBean.setName ("Fred")? – simpatico

+1

@simpatico para una sola propiedad conocida, obviamente, sí. Pero si desea administrar el acceso a muchas propiedades diferentes de muchos tipos diferentes de objetos, use las propiedades de bean –

+1

gracias. Lo compro si las propiedades están configuradas en un archivo que uno carga y luego simplemente llama a BeanUtils.populate (someBean, properties); Pero en la práctica nunca llamaría a set ("nombre", "Fred") mientras puedo llamar a setName ("Fred") directamente (yo no el tuyo es solo código de ejemplo). – simpatico

37

Usted pregunta es muy clara, pero si lo consigo:

Sí. El paquete java.beans tiene el llamado Introspector. Allí puedes leer las propiedades de un frijol.

BeanInfo info = Introspector.getBeanInfo(Bean.class); 
PropertyDescriptor[] pds = info.getPropertyDescriptors(); 

Puede encontrar el PropertyDescriptor deseada por su nombre y se le puede llamar getReadMethod().invoke(..)

+9

Prefiero este método porque no necesita dependencias. –

1

He tratado BeanUtils así como PropertyDescriptors porque no tenía la información de la clase que fue pasado a mi método. Ni siquiera sabía los tipos de datos de las propiedades aprobadas, por lo que los valores de configuración se volvieron difíciles. Sé que BeanUtils debería hacer la conversión automáticamente para la propiedad y configurarla, pero no estaba guardando los datos para mí. Finalmente, tuve que confiar en obtener los campos. Esto es lo que hice:

Field[] fields = className.getDeclaredFields(); 
for (int i=0; i<fields.length ;i++) 
{ 
    String element = fields[i].getName(); 
    String propertyType = fields[i].getType().getName(); 
    fields[i].setAccessible(true); 
    if(propertyType.equalsIgnoreCase("java.lang.Integer")) 
    { 
     fields[i].set(mypojoObj, Integer.parseInt(parameterValue)); 
    } 
    else 
    { 
     fields[i].set(mypojoObj, parameterValue); 
    } 
} 

Hice una caja de interruptores similar para convertir todos los tipos de propiedades en tipos correctos. Al recuperar de la página, request.getParameter (paramname) siempre devolvía String, por lo que esta conversión me funcionó. Cualquier mejor opción para la conversión directa de datos será realmente útil.

Cuestiones relacionadas