2010-12-27 8 views
1

У меня есть класс Foo, который является свойством типа Bar.Как получить метод вложенного свойства?

public class Foo { 
    public Bar getBar() { 

    } 
} 

public class Bar { 
    public String getName(); 
} 

Есть ли вспомогательный класс или метод, который получает вас java.lang.reflect.Method объект имя свойства Bar, используя Foo.class и «bar.name»?

Существует класс называется PropertyUtils в Общинах BeanUtils, но его getPropertyDescriptor() работает только для Object экземпляров, а не Class экземпляров.

Я понимаю, что совсем не сложно реализовать его, но я бы хотел использовать то, что уже доступно.

Кроме того, тот факт, что мне нужен объект Method, не является результатом плохого дизайна (надеюсь, что нет). То, над чем я работаю, в значительной степени является редактором JavaBeans.

Спасибо!

+0

Возможно, вы имели в виду: public bar getBar() "? –

+0

Бьюсь об заклад, он сделал это, иначе вопрос не имеет никакого смысла. – OscarRyz

ответ

1

В Commons BeanUtils, PropertyUtils.getPropertyDescriptors() принимает вход Class и возвращает массив PropertyDescriptor.

Я не знаю, вернет ли он «вложенные» имена, такие как bar.name, но если нет, не следует слишком усложнять результирование результата и создать собственный список вложенных имен.

Просто быстрая проверка здравомыслия, хотя ... нужен ли миру еще один редактор JavaBeans?

+0

Хех, это не редактор JavaBeans, а веб-форма, которая заимствует некоторые концепции из редакторов JavaBeans. –

1

Я бы пошел с MVEL или OGNL и пропустил требование «Мне нужен объект метода».

1

Здесь вы входите в вложенную поддержку: В зависимости от прецедента извлеченные классы могут быть кэшированы. Например, в приложении для обработки данных, где используется сильная фильтрация.

/** 
* 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; 
} 
Смежные вопросы