web-dev-qa-db-fra.com

Java API de propriété Reflection Beans

Existe-t-il un moyen standard d'accéder à Java Bean Property comme

class A {
   private String name;

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

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

}

Alors, puis-je accéder à ce Java nom de la propriété du bean à l'aide de l'API Reflection de sorte que lorsque je change la valeur de la propriété, les méthodes de getName et setName sont appelées automatiquement lorsque je définis et récupère les valeurs de cette propriété

25
Troydm

Ce dont vous avez besoin, c'est du mécanisme BeanInfo/Introspector (voir la réponse de Bozho). Cependant, c'est l'enfer de l'utiliser directement, vous pouvez donc utiliser l'une des bibliothèques qui offrent un accès basé sur les propriétés. Le plus connu est probablement Apache Commons/BeanUtils (un autre est celui de Spring BeanWrapper abstraction)

Exemple de code:

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"); 
44

Votre question n'est pas très claire, mais si je comprends bien:

Oui. Le package Java.beans A ce qu'on appelle Introspector . Là, vous pouvez lire les propriétés d'un bean.

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

Vous pouvez trouver le PropertyDescriptor souhaité par son nom et vous pouvez appeler getReadMethod().invoke(..)

41
Bozho

J'ai essayé BeanUtils ainsi que PropertyDescriptors parce que je n'avais pas les informations sur la classe qui ont été transmises à ma méthode. Je ne connaissais même pas les types de données des propriétés transmises et il était donc difficile de définir des valeurs. Je sais que BeanUtils devrait effectuer la conversion automatiquement pour la propriété et la définir, mais il ne sauvegardait pas les données pour moi. Alors finalement, je devais compter sur l'obtention des champs. Voici ce que j'ai fait:

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

J'ai fait un switch-case similaire pour convertir tous les types de propriétés en types corrects. Lors de la récupération à partir de la page, request.getParameter (paramname) renvoyait toujours String, donc cette conversion a fonctionné pour moi. De meilleures options pour la conversion directe des données seront vraiment utiles.

1
Manish