Accessing private fields value in Java using reflection
1. Call getDeclaredField("privateField") with
parameter variable name which will return instance of java.lang.reflect.Field.
2. Call setAccessible(true) on Field instance to make it accessible .
3. Now fetch the private field value using
Field.get(String field_name).
import java.lang.reflect.Field;
class PrivateObject1 {
private String privateField;
public PrivateObject1(String privateField) {
this.privateField
= privateField;
}
}
public class TestReflectionFields {
public static void main(String[] args) throws
IllegalArgumentException,
IllegalAccessException {
PrivateObject1
student = new PrivateObject1("Private Field");
try {
/**
* NoSuchFieldException-if a specified field is not found.
* NullPointerException-if name is null.
* SecurityException
*/
Field
privateField =
PrivateObject1.class.getDeclaredField("privateField");
/** SecurityException - if the request is denied. */
privateField.setAccessible(true);
/**
* IllegalAccessException-if the field is inaccessible.
* IllegalArgumentException
* NullPointerException-if the specified object is null and
the field
is an instance field.
*
ExceptionInInitializerError-if the initialization
provoked by this method fails.
*/
String
fieldValue = (String) privateField.get(student);
System.out.println("using reflection#"+fieldValue+" #accessed!");
}
catch
(SecurityException e ) {
}
catch
(NoSuchFieldException e) {
}
}
}
Output: using reflection # Private Field #accessed !
If you try to access private field without calling setAccessible(true)
method, there will be IllegalAccessException.
Exception in thread "main" java.lang.IllegalAccessException: Class core.reflection.TestReflectionFields
cannot access a member of class core.reflection.PrivateObject1 with modifiers
"private"
at
sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
at
java.lang.reflect.Field.doSecurityCheck(Field.java:960)
at
java.lang.reflect.Field.getFieldAccessor(Field.java:896)
at
java.lang.reflect.Field.get(Field.java:358)
at
core.reflection.TestReflectionFields.main(TestReflectionFields.java:33)
No comments:
Post a Comment