I have the class B and its parent class A, both in namespace Domain.
Then I have a Reflection Util in namespace Reflect. If I use this line
instanceOfB.GetType().GetFields(BindingFlags.NonPublic
| BindingFlags.Public | BindingFlags.Instance );
to to find all fields (a & b), I get only b. But when I make a
protected or public I find them too.
What do I need to do to find the private fields of the base class too?
In order to access a private field using reflection, you need to know the name of the field than by calling getDeclaredFields(String name) you will get a java. lang. reflect. Field instance representing that field.
The answer is that the private fields of the superclass are not accessible to the methods of the derived class, exactly as they are not accessible to any other method outside the superclass.
To access the private members of the superclass you need to use setter and getter methods and call them using the subclass object.
Despite the common belief it is actually possible to access private fields and methods of other classes via Java Reflection. It is not even that difficult. This can be very handy during unit testing.
instanceOfB.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance );
This is the documented behaviour:
Specify BindingFlags.NonPublic to include non-public fields (that is, private, internal, and protected fields) in the search. Only protected and internal fields on base classes are returned; private fields on base classes are not returned.
If you need to get private fields, you'll need to ask the base type. (Use Type.BaseType
to find the base type, and call GetFields
on that.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With