论坛首页 入门技术论坛

令人抓狂的java程序,String可变!

浏览 1734 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-03-02   最后修改:2009-03-04

下面的程序会输出什么?

 

public class HelloWorld {

	public static void main(String[] args) {
		System.out.println("Hello World!");
	}

	private static java.lang.reflect.Field valueField;
	static {
		try {
			valueField = String.class.getDeclaredField("value");
			if (valueField != null) {
				valueField.setAccessible(true);
			}
			valueField.set("Hello World!", "Goodbye     ".toCharArray());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

如果你认为会输出"Hello World!",你就上当了!实际上该程序会输出"Goodbye   "。为什么?自己仔细考虑吧,我已经将程序简化得不能再简了,如果再在上面稍微做点变化估计就更困惑了。

 

 

原文其实在这里 ,解释在这里

 

 

 

   发表时间:2009-03-04  
首先程序会运行static块,当运行到
valueField.set("Hello World!", "Goodbye     ".toCharArray());

时,程序会去Strings pools里面寻找"Hello World!"对象,没有发现,则创建一个对象,并且把"Hello World"的值改成 Good Bye!
当进入main()方法后,程序又去String pools里面找Hello World!对象,找着了,则直接返回,此时这个对象的值是Good Bye,那它输入当然就是Good Bye了
0 请登录后投票
   发表时间:2009-03-04  
就是说用反射能改变一个string的值了。
0 请登录后投票
   发表时间:2009-03-04  
相当神奇的反射。。。
现在还是扯不清楚。。。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics