JAVA通过反射修改private,final的值
以下是两个类,我们需要对他的值进行修改
class PrivateName {
private String name = "init";
public String getName() {
return name;
}
}
class FinalName {
public final String name = "init";
}
测试类
public class Test {
public static void main(String[] args) throws Exception {
PrivateName privateName = new PrivateName();
FinalName finalName = new FinalName();
modify(privateName, "name", "private change");
modify(finalName, "name", "final change");
System.out.println(privateName.getName());
System.out.println(finalName.name);
}
public static void modify(Object object, String fieldName, Object newFieldValue) throws Exception {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, newFieldValue);
System.out.println(field.get(object));
}
}
输出
private change
final change
private change
init
我们可以看到private正常修改,但是final修改正常但是获取的依然是原先的值,这是因为内联优化。
final值在八个基本变量和”“生成的String修改虽然成功但是是不能获取到修改值的,想获取修改后的值需要new String(“”)就能获取修改后的值。