Я пытаюсь получить доступ к значениям некоторых полей из базы bean страницы JSF через отражение. Проблема в том, что когда я использую getter, я получаю правильное значение, но когда я использую метод get (obj) необходимых полей, я всегда получаю возвращаемое значение null.
Получение beanObject:
ELContext elcontext = FacesContext.getCurrentInstance().getELContext();
Object beanObject = FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elcontext, null, beanName);
Чтобы получить значения полей без использования getter, я делаю следующее:
List<Field> fields = new ArrayList<Field>();
ParamsBuilder.getAllFields(fields, beanClass);
for(Field field: fields) {
field.setAccessible(true);
System.out.println(field.getName() + ": " + field.get(beanObject)); //just to see if it works
}
Метод getAllFields имеет эту реализацию:
public static List<Field> getAllFields(List<Field> fields, Class<?> type) {
for (Field field: type.getDeclaredFields()) {
fields.add(field);
}
if (type.getSuperclass() != null) {
fields = getAllFields(fields, type.getSuperclass());
}
return fields;
}
Чтобы получить значения с помощью геттера, я делаю следующее:
private ClassX getValue(Object beanObject, Class<?> beanClass) throws Exception {
Method getter = beanClass.getDeclaredMethod("myMethod",(Class<?>[]) null);
return (ClassX)getter.invoke(beanObject, (Object[])null);
}
Что я могу еще упомянуть, так это то, что поля, к которым я пытаюсь получить доступ, вводятся аннотацией @Inject, но я не думаю, что это проблема, поскольку другие поля экземпляра, не вставляемые, страдают от той же привязанности.
Обычно я использую getter, но то, что я пытаюсь сделать здесь, оказывает глобальное влияние на приложение, которое я разрабатываю, а это значит, что возвращение и изменение всех затронутых классов для предоставления getters - это последнее решение. Также это приложение будет постоянно изменяться и расширяться, и я не хочу, чтобы другие разработчики не предоставляли геттеры, что приведет к серьезным проблемам.
Спасибо!