Est-il possible de cartographier le membre avec les méthodes Getter / Setter?

StackOverflow https://stackoverflow.com/questions/20353966

  •  25-08-2022
  •  | 
  •  

Question

Par exemple, j'ai quelques classes avec plusieurs champs, l'un d'eux est comme ci-dessous, je veux sortir tous les champs de son instance, mais je dois obtenir le mappage entre le nom du membre avec des méthodes Getter, puis-je l'obtenir par réflexion?

public class MappingMemberWithGetterOrSetter {
private String memberOne;
private int memberTwo;

public String getMemberOne() {
    return memberOne;
}

public void setMemberOne(String memberOne) {
    this.memberOne = memberOne;
}

public int getMemberTwo() {
    return memberTwo;
}

public void setMemberTwo(int memberTwo) {
    this.memberTwo = memberTwo;
}
}
Était-ce utile?

La solution

C'est peut-être ce que vous voulez. Avec le Introspecteur vous pouvez obtenir le Beaninfo Et cela vous donne accès aux haricots PropertyDescriptors.

BeanInfo beanInfo = Introspector.getBeanInfo(MappingMemberWithGetterOrSetter.class, Object.class);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
    String propertyName = propertyDescriptor.getName();
    Method getter = propertyDescriptor.getReadMethod();
    Method setter = propertyDescriptor.getWriteMethod();
    Field field = MappingMemberWithGetterOrSetter.class
                .getDeclaredField(propertyName);
    System.out.println("Property " + propertyName + " field:  " + field);
    System.out.println("Getter " + getter);
    System.out.println("Setter " + setter);
}

Autres conseils

c'est ce que tu veux?

Class aClass = ...//obtain class object
Field[] methods = aClass.getFields(); 

Field field = ... //obtain field object
String fieldName = field.getName();

Après cela, vous pouvez accéder à Getter et Setter du champ via

Object value = field.get(objectInstance);

field.set(objetInstance, value);

où ObjectInstance est une instance de la classe propriétaire du champ.

Une propriété en Java est définie par Getter et / ou Setter. Si tu as un getLength Méthode sans paramètre et avec une valeur de retour, vous avez une propriété lisible length. Si vous avez une méthode appelée setLength(Type value) Ensuite, vous avez une propriété inscrite appelée length. Si vous avez les deux, la propriété est à la fois lisible et écrit.

Les champs ne sont pas impliqués dans la définition d'une propriété Java. Comment et si vous soutenez vos propriétés avec des champs dépend de vous.

public long getDoubleLength() { return getLength()*2; }

constitue une propriété en lecture seule du nom doubleLength. Aucun champ n'existe pour cette propriété.

Donc, ce que vous voulez n'est pas possible en général. Si vous souhaitez le faire pour des classes propres spécifiques où vous savez que ce mappage existe ou si vous souhaitez tester d'autres classes pour ce modèle, vous pouvez obtenir des méthodes et des champs via la réflexion et vérifier si les champs avec les noms de propriété existent.

Mais cela peut ne pas fonctionner tout le temps. Certaines personnes utilisent des conventions comme _member ou mField pour les noms de champ. Ceci est entièrement à égalité avec la définition de Java Beans où les propriétés sont définies par les getters et les setters, mais rompent avec l'approche naïve des noms correspondants.

public void getMethods(Class<?> className)
{                   
         Method[] methods = className.getMethods();             
         for(Method method : methods)
            {
           if(method.getDeclaringClass().getName().equalsIgnoreCase("java.lang.Object") )
             {
                 //Do nothing
             }
             else
             {
                if(StringUtils.startsWith( method.getName(),"get"))
                    {   
                        //Here u ll get all get methods                         
                    }
             }                              
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top