565123 发表于 2013-9-27 22:23:57

谁可以解释这奇怪的结果

本帖最后由 565123 于 2013-10-10 13:28 编辑

package test;

import java.lang.reflect.Field;

public class Test {

      public static void main(String[] args) {
                changeString("123", "456");
                System.out.println("123");
      }

      private static void changeString(String s, String sample)
                        throws NullPointerException {
                changeString(s, sample.toCharArray());
      }

      private static void changeString(String str, char[] chs)
                        throws NullPointerException {
                if (str == null)
                        throw new NullPointerException("s cannot be null.");
                Field field = null;
                try {
                        field = String.class.getDeclaredField("value");
                        field.setAccessible(true);
                        field.set(str, chs);
                } catch (Exception e) {
                        e.printStackTrace();
                }
      }

}测试看看鱼油们的水平!!
是不是运行起来和预期的结果不一样!

565123 发表于 2013-10-10 13:29:14

快来啊!!怎么没人啊

c270844905 发表于 2013-10-10 14:09:49

路过,打酱油。{:5_103:}

牡丹花下死做鬼 发表于 2013-10-12 17:38:33

JAVA啊 呜呜 看不懂

565123 发表于 2013-10-23 00:46:39

{:7_155:}顶顶{:7_155:}

冰菓 发表于 2013-11-20 08:50:01

看不懂。。

565123 发表于 2013-11-23 21:38:08

冰菓 发表于 2013-11-20 08:50 static/image/common/back.gif
看不懂。。

大家可以自行运行一下啊

≮芸魡影耔≯ 发表于 2013-12-8 11:03:28

因为前后"123"是同一个对象 而这个对象的值你通过反射赋予新值了啊

不了缘_hy 发表于 2013-12-16 15:58:21

还能这样换。。。。

魔王子 发表于 2014-2-19 20:17:49

打个酱油哇

魔王子 发表于 2014-2-19 20:19:10

我还是打酱油的啊

Samples、懂么 发表于 2014-3-30 17:19:05

{:5_109:}wo shi guonlai na yu bi de

765643729 发表于 2014-5-27 23:43:11

不明觉厉..

Samples、懂么 发表于 2014-5-28 09:30:37

可能是因为String是一个不可变字符串,当输出“123”的时候是去常量池里去找,通过爆力反射改掉了常量池里的值,那么输出的就是改变后的值了,底层代码略微看了一下。应该就是酱紫吧

我要成为海贼王 发表于 2014-6-20 14:21:32

支持楼主的jpg

沧海.sea 发表于 2014-9-30 09:06:48

:huffy: 看不懂

沧海.sea 发表于 2014-9-30 09:08:41

http://docs.oracle.com/javase/7/docs/api/在这里面查:java.lang.reflect里面的方法
页: [1]
查看完整版本: 谁可以解释这奇怪的结果