snippetjavaCritical
How to read the value of a private field from a different class in Java?
Viewed 0 times
privatehowfieldfromjavaclassthevaluedifferentread
Problem
I have a poorly designed class in a 3rd-party
why should I need to choose private field is it necessary?
How can I use reflection to get the value of
JAR and I need to access one of its private fields. For example,why should I need to choose private field is it necessary?
class IWasDesignedPoorly {
private Hashtable stuffIWant;
}
IWasDesignedPoorly obj = ...;How can I use reflection to get the value of
stuffIWant?Solution
In order to access private fields, you need to get them from the class's declared fields and then make them accessible:
EDIT: as has been commented by aperkins, both accessing the field, setting it as accessible and retrieving the value can throw
The
The
The
Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessExceptionEDIT: as has been commented by aperkins, both accessing the field, setting it as accessible and retrieving the value can throw
Exceptions, although the only checked exceptions you need to be mindful of are commented above.The
NoSuchFieldException would be thrown if you asked for a field by a name which did not correspond to a declared field. obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldExceptionThe
IllegalAccessException would be thrown if the field was not accessible (for example, if it is private and has not been made accessible via missing out the f.setAccessible(true) line.The
RuntimeExceptions which may be thrown are either SecurityExceptions (if the JVM's SecurityManager will not allow you to change a field's accessibility), or IllegalArgumentExceptions, if you try and access the field on an object not of the field's class's type:f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong typeCode Snippets
Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessExceptionobj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldExceptionf.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong typeContext
Stack Overflow Q#1196192, score: 756
Revisions (0)
No revisions yet.