Change private static final field using Java reflection
I followed the instructions in the link above to change a private static final field using java reflection. I have an object named "data." Inside "data," there is a private static final variable named "type." I want to set "type" to be null. Here is my code.
Field field = data.getClass().getDeclaredField("type");
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(data, null);
I tried doing this on Java 1.7 with similar code and it worked. But running this code on Android produces the following error: java.lang.NoSuchFieldException: modifiers
I guess "modifiers" is not a field in the Field class on Android.
How do I fix this?
In Java, non-static final variables can be assigned a value either in constructor or with the declaration. But, static final variables cannot be assigned value in constructor; they must be assigned a value with their declaration.
If we want to access Private Field and method using Reflection we just need to call setAccessible(true) on the field or method object which you want to access. Class. getDeclaredField(String fieldName) or Class. getDeclaredFields() can be used to get private fields.
Finally, with the static final variable, it's both the same for each class and it can't be changed after it's initialized.
final fields can be changed via reflection and other implementation dependent means. The only pattern in which this has reasonable semantics is one in which an object is constructed and then the final fields of the object are updated.
This works for non-static fields.
Field field = data.getClass().getDeclaredField("type");
field.setAccessible(true);
field.set(data, null);
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