Android 使用 Java 反射更改私有(private)静态最终字段?

标签 android

我想将“NO_CACHE”设置为新值。这是我的代码:

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平台上运行不正常。

我该如何解决这个问题?

最佳答案

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

关于Android 使用 Java 反射更改私有(private)静态最终字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13755117/

相关文章:

java - 在 list 或代码中注册接收者是更好的代码实践吗?

php - 将图像从android上传到PHP服务器

java - Android:如何创建数据库管理类的对象然后使用它?

Android - 同一行中的两个按钮填充整个宽度

android - 此版本的应用程序未配置为通过 Google Play 计费

Android Maven 项目 - 在 pom.xml 中出现错误

java - onResume 中的 NullPointerException

java - 在 fragment 中保存首选项

android - Spinner OnItemSelected 使用自定义适配器

android - 忽略 Jetpack Compose Card 上的单击,但在包含的布局中捕获它