Frage

Zum Beispiel habe ich einige Klassen mit mehreren Feldern, einer davon ist wie unten. Ich möchte alle Felder seiner Instanz ausgeben. Ich muss jedoch die Zuordnung zwischen dem Mitgliedsnamen mit Gettter -Methoden erhalten. Kann ich es durch Reflexion bekommen?

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;
}
}
War es hilfreich?

Lösung

Vielleicht ist das, was Sie wollen. Mit dem Introspector Sie können das bekommen Beaninfo Und dies gibt Ihnen Zugang zu den Bohnen 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);
}

Andere Tipps

Ist das was du willst?

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

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

Danach können Sie über Getter und Setter des Feldes zugreifen

Object value = field.get(objectInstance);

field.set(objetInstance, value);

wo Objectinstance eine Instanz der Klasse ist, die das Feld besitzt.

Eine Eigenschaft in Java wird von Getter und/oder Setter definiert. Wenn Sie eine haben getLength Methode ohne Parameter und mit einem Rückgabewert haben Sie eine lesbare Eigenschaft mit dem Namen length. Wenn Sie eine Methode genannt haben setLength(Type value) Dann haben Sie eine schriftliche Eigenschaft namens namens length. Wenn Sie beide haben, ist die Eigenschaft sowohl lesbar als auch beschreibbar.

Felder sind nicht an der Definition einer Java -Eigenschaft beteiligt. Wie und wenn Sie Ihre Eigenschaften mit Feldern unterstützen, liegt bei Ihnen.

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

stellt eine schreibgeschützte Eigenschaft des Namens dar doubleLength. Für diese Eigenschaft gibt es kein Feld.

Was Sie also wollen, ist im Allgemeinen nicht möglich. Wenn Sie dies für bestimmte eigene Klassen tun möchten, in denen Sie wissen, dass diese Zuordnung vorhanden ist, oder wenn Sie andere Klassen für dieses Muster testen möchten, können Sie Methoden und Felder über Reflexion abrufen und überprüfen, ob Felder mit den Eigenschaftsnamen vorhanden sind.

Dies funktioniert jedoch nicht die ganze Zeit. Einige Leute verwenden Konventionen wie _member oder mField für die Feldnamen. Dies entspricht der Definition von Java Beans, bei der Eigenschaften von Gettern und Setter definiert werden, aber mit dem naiven Ansatz der passenden Namen brechen.

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                         
                    }
             }                              
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top