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