我想将"NO_CACHE"设置为newValue.这是我的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是在Android上运行此代码会产生以下错误:
java.lang.NoSuchFieldException: modifiers
Run Code Online (Sandbox Code Playgroud)
我发现Java modifiers中的Field类是一个字段,但它不是FieldAndroid上类中的字段.
这是Java Field类代码:
http://www.docjar.com/html/api/java/lang/reflect/Field.java.html
这是Android Field类代码:
http://www.oschina.net/code/explore/android-2.2-froyo/java/lang/reflect/Field.java
Java中的上述代码可以工作,但它在Android平台上不起作用.
我该如何解决?
我已经尝试了上面的解决方案并获得了在 Android 中修改静态和最终字段的正确方法,这是在 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);
Run Code Online (Sandbox Code Playgroud)
小智 3
Android实际上不使用JDK源代码。这是非常相似但又不一样的东西。
在Java中,修饰符的类型是java.lang.reflection.Field,但在Android中没有这样的类型。Android 实现了一个系统,通过调用本机方法,使用整数和字段名称来验证其修饰符。
我认为private static final字段的值为slot-1,私有字段的值为 3。如果您想更改字段private static final,只需slot在设置值之前将其更改为 3 即可。
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);
Run Code Online (Sandbox Code Playgroud)