I want to set "NO_CACHE" to be newValue. Here is my code:
static void setFinalStatic(Object newValue) throws Exception
{
    Field field = CacheManager.class.getDeclaredField("NO_CACHE");
    field.setAccessible(true);
    Field modifiersField=Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field,field.getModifiers() & ~Modifier.FINAL);
    field.set(null, newValue);
}
But running this code on Android produces the following error:
java.lang.NoSuchFieldException: modifiers
I find modifiers is a field in the Field class in Java, but it is not a field in the Field class on Android.
This is Java Field class code:
http://www.docjar.com/html/api/java/lang/reflect/Field.java.html
This is Android Field class code:
http://www.oschina.net/code/explore/android-2.2-froyo/java/lang/reflect/Field.java
The above code in Java can work, but it does not work on the Android platform.
How do I fix this?
I have tried the solutions above and get the correct way to modify static and final field in Android,here is the code works in Android 7.0
Field booleanField = Boolean.class.getField("FALSE");
booleanField.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("accessFlags");
modifiersField.setAccessible(true);
modifiersField.setInt(field,field.getModifiers() & ~Modifier.FINAL);
booleanField.set(null, true);
                        Android actually doesn't use JDK source code. It's something very alike but not the same.
In Java, modifiers are of type java.lang.reflection.Field, but in Android there is no such type. Android implemented a system which uses an integer and the name of the Field to validate it's modifiers, by calling a native method.
I think a private static final field will have slot-1 and a private field will have the value 3. If you wish to change a private static final field, just change the slot to 3 before setting the value.
Field booleanField = Boolean.class.getField("FALSE");
booleanField.setAccessible(true);
Field slotField = Field.class.getDeclaredField("slot");
slotField.setAccessible(true);
slotField.set(booleanField, 3);
booleanField.set(Boolean.FALSE, true);
                        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