2010-12-27 3 views
1

Ich habe eine Klasse Foo, die eine Eigenschaft des Typs Bar ist.Wie bekomme ich eine Methode einer verschachtelten Eigenschaft?

public class Foo { 
    public Bar getBar() { 

    } 
} 

public class Bar { 
    public String getName(); 
} 

Gibt es eine Hilfsklasse oder Methode, die ein Objekt java.lang.reflect.Method der Namen Eigenschaft Bar bekommt, mit Foo.class und „bar.name“?

Es gibt eine Klasse PropertyUtils in Commons BeanUtils genannt, aber seine getPropertyDescriptor() funktioniert nur für Object Fällen nicht Class Instanzen.

Mir ist klar, dass es überhaupt nicht schwierig ist, eines zu implementieren, aber ich würde gerne das nutzen, was bereits verfügbar ist.

Auch die Tatsache, dass ich ein Method-Objekt brauche, ist kein Ergebnis eines schlechten Designs (hoffe nicht). Woran ich gerade arbeite ist ein JavaBeans-Editor.

Danke!

+0

Meinten Sie: "public bar getBar()"? –

+0

Ich wette, er hat, sonst macht die Frage keinen Sinn – OscarRyz

Antwort

1

In Commons BeanUtils, PropertyUtils.getPropertyDescriptors() nimmt eine Class als Eingabe und gibt ein Array von PropertyDescriptor zurück.

Ich weiß nicht, ob es "verschachtelte" Namen wie bar.name zurückgibt, aber wenn nicht, sollte es nicht zu schwer sein, auf das Ergebnis zu recursen und eine eigene Liste verschachtelter Namen zu konstruieren.

Nur eine schnelle Überprüfung der Vernunft aber ... braucht die Welt wirklich noch einen JavaBeans Editor?

+0

Heh, es ist kein JavaBeans-Editor pro sagen, aber ein Web-Formular, das einige Konzepte aus JavaBeans-Editoren leiht. –

1

Ich würde gehen mit MVEL oder OGNL und überspringen die Anforderung "Ich brauche die Methode Objekt".

1

Hier geht es zur geschachtelten Unterstützung: Je nach Anwendungsfall konnten die abgerufenen Klassen zwischengespeichert werden. Zum Beispiel in einer Datatable-Crud-Anwendung, bei der eine starke Filterung verwendet wird.

/** 
* Retrieves the type of the property with the given name of the given 
* Class.<br> 
* Supports nested properties following bean naming convention. 
* 
* "foo.bar.name" 
* 
* @see PropertyUtils#getPropertyDescriptors(Class) 
* 
* @param clazz 
* @param propertyName 
* 
* @return Null if no property exists. 
*/ 
public static Class<?> getPropertyType(Class<?> clazz, String propertyName) 
{ 
    if (clazz == null) 
     throw new IllegalArgumentException("Clazz must not be null."); 
    if (propertyName == null) 
     throw new IllegalArgumentException("PropertyName must not be null."); 

    final String[] path = propertyName.split("\\."); 

    for (int i = 0; i < path.length; i++) 
    { 
     propertyName = path[i]; 
     final PropertyDescriptor[] propDescs = PropertyUtils.getPropertyDescriptors(clazz); 
     for (final PropertyDescriptor propDesc : propDescs) 
      if (propDesc.getName().equals(propertyName)) 
      { 
       clazz = propDesc.getPropertyType(); 
       if (i == path.length - 1) 
        return clazz; 
      } 
    } 

    return null; 
} 
Verwandte Themen