性能问答>这个反射的结果有点怪啊,大佬们谁能帮我看看>
3回复
2年前

这个反射的结果有点怪啊,大佬们谁能帮我看看



最近写业务代码发现一个问题,反射的结果有点奇怪。我模拟业务写了一个测试代码,把问题复现了,大佬们帮我看看呗。

public class Test{
	private final String str = "ss";
	private final String str2;

	Test(){
	    str2 = "ss";
	}

	public static void main(String[] args) throws Exception {
		Test test = new Test();
		Field str = Test.class.getDeclaredField("str");
    		str.setAccessible(true);
    		str.set(test, "xxx");
    		System.out.println(test.str);
    
    
    
    		Field str2 = Test.class.getDeclaredField("str2");
    		str2.setAccessible(true);
    		str2.set(test, "xxx2");
    		System.out.println(test.str2);

	}
}

这个程序执行下来的话,我们想得到的输出应该是
xxx
xxx2
但是我们得到的输出却是
ss
xxx2
我用的是jdk8,这个输出为什么这样?而且如果str1修改失败了,那么为什么str2修改成功了?

3383 阅读
请先登录,再评论

其实str修改成功了,只是输出test.str并不是使用getField指令获取值而是使用ldc直接从常量池取值
image.png
这应该是编译对final标识的字符串做出的优化,在取值的时候用反射可以拿到修改后的值

32年前

反编译一下就懂了,哈哈哈

image.png

反编译结果:
image.png

32年前
2年前回复