Get all fields (even private and inherited) from class
obj = obj.getClass().getSuperclass().cast(obj);
This line does not do what you expect it to do. Casting an Object
does not actually change it, it just tells the compiler to treat it as something else.
E.g. you can cast a List
to a Collection
, but it will still remain a List
.
However, looping up through the super classes to access fields works fine without casting:
Class<?> current = yourClass;
while(current.getSuperclass()!=null){ // we don't want to process Object.class
// do something with current's fields
current = current.getSuperclass();
}
BTW, if you have access to the Spring Framework, there is a handy method for looping through the fields of a class and all super classes:ReflectionUtils.doWithFields(baseClass, FieldCallback)
(also see this previous answer of mine: Access to private inherited fields via reflection in Java)
getDeclaredFields()
gives you all fields on that Class, including private
ones.
getFields()
gives you all public
fields on that Class AND it's superclasses.
If you want private
/ protected
methods of Super Classes, you will have to repeatedly call getSuperclass()
and then call getDeclaredFields()
on the Super Class object.
Nothing here isn't clearly explained in the javadocs
Here is the method I use to get all the fields of an object
private <T> List<Field> getFields(T t) {
List<Field> fields = new ArrayList<>();
Class clazz = t.getClass();
while (clazz != Object.class) {
fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
clazz = clazz.getSuperclass();
}
return fields;
}