浏览 1763 次
锁定老帖子 主题:令人抓狂的java程序,String可变!
精华帖 (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 "。为什么?自己仔细考虑吧,我已经将程序简化得不能再简了,如果再在上面稍微做点变化估计就更困惑了。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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了 |
|
返回顶楼 | |
发表时间:2009-03-04
就是说用反射能改变一个string的值了。
|
|
返回顶楼 | |
发表时间:2009-03-04
相当神奇的反射。。。
现在还是扯不清楚。。。 |
|
返回顶楼 | |