9

我想将“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

我发现modifiersFieldJava 类中的一个字段,但它不是FieldAndroid 类中的一个字段。

这是JavaField类代码:

http://www.docjar.com/html/api/java/lang/reflect/Field.java.html

这是AndroidField类代码:

http://www.oschina.net/code/explore/android-2.2-froyo/java/lang/reflect/Field.java

上面Java中的代码可以工作,但是在Android平台上不行。

我该如何解决?

4

2 回答 2

6

我已经尝试了上面的解决方案,并获得了在 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);
于 2018-09-14T09:17:16.117 回答
3

Android 实际上不使用 JDK 源代码。这是非常相似但又不一样的东西。

在 Java 中,修饰符是 type 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);
于 2014-01-23T18:31:28.123 回答