API-интерфейс свойств Java Reflection Beans - PullRequest
24 голосов
/ 02 мая 2011

Существует ли какой-либо стандартный способ доступа к свойству Java Bean, например

class A {
   private String name;

   public void setName(String name){
       this.name = name;
   }

   public String getName(){
       return this.name;
   }

}

Так что я могу получить доступ к этому имени свойства Java-компонента, используя Reflection API, чтобы при изменении значения свойства применялись методы getName и setNameвызываются автоматически, когда я устанавливаю и получаю значения этого свойства

Ответы [ 3 ]

43 голосов
/ 02 мая 2011

Вам нужен механизм BeanInfo / Introspector (см. Ответ Божо).Однако использовать это напрямую - это ад, поэтому вы можете использовать одну из библиотек, которые предлагают доступ на основе свойств.Наиболее известным из них является, вероятно, Apache Commons / BeanUtils (еще одно - Spring * BeanWrapper абстракция)

Пример кода:

A someBean = new A();

// access properties as Map
Map<String, Object> properties = BeanUtils.describe(someBean);
properties.set("name","Fred");
BeanUtils.populate(someBean, properties);

// access individual properties
String oldname = BeanUtils.getProperty(someBean,"name");
BeanUtils.setProperty(someBean,"name","Barny"); 
41 голосов
/ 02 мая 2011

Твой вопрос очень неясен, но если я его получу:

Да. Пакет java.beans имеет так называемый Introspector. Там вы можете прочитать свойства бобов.

BeanInfo info = Introspector.getBeanInfo(Bean.class);
PropertyDescriptor[] pds = info.getPropertyDescriptors();

Вы можете найти нужный PropertyDescriptor по его имени и позвонить getReadMethod().invoke(..)

1 голос
/ 31 мая 2013

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

Field[] fields = className.getDeclaredFields();
for (int i=0; i<fields.length ;i++)
{
  String element = fields[i].getName();
  String propertyType = fields[i].getType().getName();
  fields[i].setAccessible(true);
  if(propertyType.equalsIgnoreCase("java.lang.Integer"))
    {
      fields[i].set(mypojoObj, Integer.parseInt(parameterValue));
    }
    else
    {
      fields[i].set(mypojoObj, parameterValue);
    }
 }

Я сделал похожий случай переключения, чтобы преобразовать все типы свойств в правильные типы.При извлечении со страницы request.getParameter (paramname) всегда возвращал String, поэтому это преобразование сработало для меня.Любые лучшие варианты для прямого преобразования данных будут действительно полезны.

...