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