Android:使用 Java 反射更改私有静态最终字段

Posted

技术标签:

【中文标题】Android:使用 Java 反射更改私有静态最终字段【英文标题】:Android: changing private static final field using java reflection 【发布时间】:2012-06-26 11:30:18 【问题描述】:

Change private static final field using Java reflection

我按照上面链接中的说明使用 java 反射更改了私有静态最终字段。我有一个名为“数据”的对象。在“数据”中,有一个名为“类型”的私有静态最终变量。我想将“类型”设置为空。 这是我的代码。

Field field = data.getClass().getDeclaredField("type");
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(data, null);

我尝试在 Java 1.7 上使用类似的代码执行此操作,并且成功了。但在 android 上运行此代码会产生以下错误: java.lang.NoSuchFieldException:修饰符

我猜“修饰符”不是 Android 上 Field 类中的字段。

我该如何解决这个问题?

【问题讨论】:

你...不能在运行时更改类字段上的修饰符 我可以根据那个链接。 请记住,Java 编译器可以内联原始静态最终字段的值。做这种反射魔法可能会导致奇怪的行为。 【参考方案1】:

这适用于非静态字段。

Field field = data.getClass().getDeclaredField("type");
field.setAccessible(true);
field.set(data, null);

【讨论】:

这行得通。但为什么? ART 是删除 final 修饰符还是简单地允许访问它? 这行得通,因为field.set(...)函数中的第一个对象是要修改的对象而不是字段 这种情况下数据不是静态的?

以上是关于Android:使用 Java 反射更改私有静态最终字段的主要内容,如果未能解决你的问题,请参考以下文章

java反射访问私有方法的的问题

有没有办法使用反射类设置私有/受保护的静态属性?

Java反射在Android中的使用

java单例之enum实现方式

Java面试题:如何通过反射获取和设置对象私有字段的值?

一篇文章带你了解Java反射