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

use*_*025 8 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);
}
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平台上不起作用.

我该如何解决?

Bil*_*ong 5

我已经尝试了上面的解决方案并获得了在 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)

  • Android 中的字段称为“accessFlags”,而不是“slot”,也不是“modifiers” (8认同)