mercredi 15 avril 2015

Java reflection: Field.get(obj) returns all nulls but method invoke on getters return correct values

I am trying to access the values of some fields from the backing bean of a JSF page via reflection. The problem is that when I use the getter I get the correct value but when I use the get(obj) method of the necessary fields I always get a null value returned.


To get the fields values without using the getter I do the following:



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

}


The getAllFields method has this implementation:



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;
}


To get the values by using the getter I do the following:



private ClassX getValue(Object beanObject, Class<?> beanClass) throws Exception {

Method getter = beanClass.getDeclaredMethod("myMethod",(Class<?>[]) null);

return (ClassX)getter.invoke(beanObject, (Object[])null);
}


What I can further mention is that the fields I am trying to access are injected with the @Inject annotation, but I don't believe this is the problem as other instance fields, not injected, suffer of the same affection.


Normally I would use the getter but what I am trying to do here has a global impact on the application I am developing, which means that going back and modifying all affected classes to provide getters is a last measure solution. Also this application will be constantly modified and extended and I don't want to take the chance of the other developers not providing the getters, which will result in serious problems.


Thank you!






Aucun commentaire:

Enregistrer un commentaire