这篇博客很好建议看看,虽然可以修改final修饰的常量但是无法修改static final修饰的常量,否则爆java.lang.IllegalAccessException: Can not set static final java.lang.String 异常
public class Main {
public static void main(String[] args) {
try {
Person p = new Person();
Field field = null;
field = p.getClass().getDeclaredField("NAME");
field.setAccessible(true);
field.set(p,"Hello");
System.out.println(field.get(p));//注意这里是p而不是"NAME"
p.showName();
} catch (Exception e) {
e.printStackTrace();
}
}
private static class Person{
//这里如此复杂的赋值是为了不让jvm优化代码将showName里面直接和值内联
public final String NAME = (null!=null?"liangchaojie":"liangchaojie");
public void showName(){
System.out.println(NAME);
}
}
}
Hello
Hello