我想将“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);
}
但在Android上运行此代码会产生以下错误:
java.lang.NoSuchFieldException: modifiers
我发现modifiers
是Java中Field
类中的一个字段,但它不是Android上Field
类中的字段。
这是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平台上不起作用。
我该如何解决这个问题?
答案 0 :(得分:2)
Android实际上并不使用JDK源代码。这是非常相似但不一样的东西。
在Java中,修饰符的类型为java.lang.reflection.Field
,但在Android中没有这种类型。 Android通过调用本机方法实现了一个使用整数和Field名称来验证其修饰符的系统。
我认为private static final
字段会有slot
- 1,私有字段的值为3.如果您想更改private static final
字段,只需更改{{1在设置值之前设置为3。
slot
答案 1 :(得分:1)
我已经尝试了上述解决方案,并获得了在Android中修改static和final字段的正确方法,这是在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);