Android使用Java Reflection更改私有静态final字段?

时间:2012-12-07 00:30:24

标签: android

我想将“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平台上不起作用。

我该如何解决这个问题?

2 个答案:

答案 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);