1 利用反射更改private字段值
public class ReflectTest {
private static String sTestOne = "Origin";
public static String getTestOne() {
return sTestOne;
}
}
try {
Field field = ReflectTest.class.getDeclaredField("sTestOne");
field.setAccessible(true);
field.set(null, "Modified");
Log.d(TAG, "sTestOne = " + ReflectTest.getTestOne());
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
输出结果:
2021-05-21 15:33:43.162 24389-24389/com.example.demo D/Charlie: sTestOne = Modified
2 利用反射更改final字段的值
这里Field的字段名称在新版本的Android中有更改,网上Field类中modifiers字段的说明是这样的:Field对象有个一个属性叫做 modifiers, 它表示的是属性是否是 public, private, static, final 等修饰的组合,而查阅Android 30源码发现字段名称改为了accessFlags
private static final String sTestTwo = new String("Origin");
try {
Field field = ReflectTest.class.getDeclaredField("sTestTwo");
Field modifiersField = Field.class.getDeclaredField("accessFlags");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.setAccessible(true);
field.set(null, "Modified");
Log.d(TAG, "sTestTwo = " + ReflectTest.getTestTwo());
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
输出结果:
2021-05-21 15:59:31.527 26806-26806/com.example.demo D/Charlie: sTestTwo = Modified
而如果将字段定义改为:
private static final String sTestTwo = "Origin";
则更改不成功
2021-05-21 16:05:11.679 27169-27169/com.example.demo D/Charlie: sTestTwo = Origin
本文详细介绍了如何使用Java反射机制来修改私有字段和final字段的值。首先展示了如何通过setAccessible(true)改变私有字段,然后通过修改accessFlags字段值来解除final修饰,从而实现final字段的更改。实验结果显示,两种方式均能成功修改字段值,但对final字段的修改仅在特定情况下有效。
3750

被折叠的 条评论
为什么被折叠?



