Подтвердить что ты не робот

Java Reflection Beans API свойств

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

class A {
   private String name;

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

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

}

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

4b9b3361

Ответ 1

Вам нужен механизм 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"); 

Ответ 2

Вы задаете вопрос очень неясно, но если я его получу:

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

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

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

Ответ 3

Я попробовал 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, поэтому это преобразование работало для меня. Любые лучшие варианты прямого преобразования данных будут действительно полезны.