Domanda

Ad esempio, ho alcune classi con diversi campi, uno di essi è come sotto, voglio produrre tutti i campi della sua istanza, tuttavia, devo ottenere la mappatura tra il nome del membro con i metodi getter, posso ottenerlo per riflessione?

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;
}
}
È stato utile?

Soluzione

Forse questo è quello che vuoi. Con il Introspettore puoi ottenere il Beaninfo E questo ti dà accesso ai fagioli PropertyDescrittori.

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

Altri suggerimenti

È questo che vuoi?

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

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

Dopodiché puoi accedere a getter e setter del campo tramite

Object value = field.get(objectInstance);

field.set(objetInstance, value);

dove ObjectInstance è un'istanza della classe che possiede il campo.

Una proprietà in Java è definita da getter e/o setter. Se hai un getLength Metodo senza parametro e con un valore di ritorno, hai una proprietà leggibile denominata length. Se hai un metodo chiamato setLength(Type value) Quindi hai una proprietà scrittabile chiamata length. Se hai entrambi, la proprietà è sia leggibile che scrittabile.

I campi non sono coinvolti nella definizione di proprietà Java. Come e se il backup delle tue proprietà con i campi dipende da te.

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

costituisce una proprietà di sola lettura del nome doubleLength. Non esiste alcun campo per questa proprietà.

Quindi ciò che vuoi non è possibile in generale. Se vuoi farlo per classi specifiche in cui si sa che questa mappatura esiste o se vuoi testare altre classi per questo modello, puoi ottenere metodi e campi tramite riflessione e verificare se esistono campi con i nomi delle proprietà.

Ma questo potrebbe non funzionare sempre. Alcune persone usano convenzioni come _member o mField Per i nomi dei campi. Questo è completamente alla pari con la definizione di java beans in cui le proprietà sono definite da getter e setter ma si romperanno con l'approccio ingenuo dei nomi corrispondenti.

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                         
                    }
             }                              
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top