<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    青菜貓(孫宇博客),青菜貓(孫宇博客),青菜貓(孫宇博客)http://www.javasdc.cn/
    posts - 29,  comments - 63,  trackbacks - 0
    這幾天閑來(lái)無(wú)事。在網(wǎng)上看了一個(gè)題目,相信大家都知道這個(gè)題目
     static void change(String str){
            str="welcome";
        }
         
        public static void main(String[] args) {
            String str = "123";
            change(str);
            System.out.println(str);
        }
    str =多少?
    如果大家都知道 。。
    然后我想把最后輸出要“welcome”怎么做?
    于是改成這樣
      static String change(String str){
            str="welcome";
            return str;
        }
    然后main里
    str=change(str);這結(jié)果改了,但是改的代碼太多。、
    我想只能改change方法。也不需要返回值,來(lái)解決問(wèn)題。先看了下
    String類(lèi)發(fā)現(xiàn) private final char value[]; 是私有的。把這個(gè)值改了不就OK了嘛
    于是想到了反射:
    代碼如下:
    static void change(String str){
            try {
                Class<?> clazz = str.getClass();
                Field fields = clazz.getDeclaredField("value");
                Object obj = fields.get(str);
                char [] charValue = (char [] )obj;
                System.out.println(charValue);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    發(fā)現(xiàn)打出結(jié)果 welcome 那么只要改掉
    charValue就OK了吧。于是繼續(xù)加代碼 發(fā)現(xiàn) modifiers "private final" 會(huì)出這個(gè)錯(cuò),
    要加上
        field.setAccessible(true);
      try {
                Class<?> clazz = str.getClass();
                Field field = clazz.getDeclaredField("value");
                field.setAccessible(true);
                Object obj = field.get(str);
                char [] charValue = (char [] )obj;
                charValue = new char [3];
                for(int i=0;i<charValue.length;i++){
                charValue[i]='a';
                }
                field.set(str, charValue);
            } catch (Exception e) {
                e.printStackTrace();
            }
    }發(fā)現(xiàn)能滿(mǎn)足我的要求,。值是被改了,然后我想改變長(zhǎng)度,于是又動(dòng)一下代碼charValue = new char [4];
    發(fā)現(xiàn)值不能改變 繼續(xù)看String源碼,發(fā)現(xiàn)有個(gè)count屬性,。于是又了改了這個(gè)值代碼如下

     try {
                Class<?> clazz = str.getClass();
                Field field = clazz.getDeclaredField("value");
                field.setAccessible(true);
                Object obj = field.get(str);
                char [] charValue = (char [] )obj;
                charValue = new char [4];
                for(int i=0;i<charValue.length;i++){
                    charValue[i]='a';
                }
                 Field field1 = clazz.getDeclaredField("count");
                 field1.setAccessible(true);
                 field1.set(str, charValue.length);
                 field.set(str, charValue);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    發(fā)現(xiàn)能解決問(wèn)題。
    我又試了下
    然后我又試下Integer 發(fā)現(xiàn)一樣可以
    代碼如下:
    static void changeInteger(Integer a){   
            try {
                Class<?> clazz = a.getClass();
                Field field = clazz.getDeclaredField("value");
                field.setAccessible(true);
                field.set(a, 12312);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    個(gè)人覺(jué)得只要Field.setAccessible(true); 之后,即使是final關(guān)鍵字標(biāo)示過(guò)得屬性也可以有訪問(wèn)權(quán)限!這樣的反射會(huì)改變JAVA的結(jié)構(gòu),甚至你的代碼可維護(hù)性,你完全可以
    改別的代碼里面的值 ,所以這只是一個(gè)簡(jiǎn)單的例子。只是驗(yàn)證通過(guò)反射能做一些讓你無(wú)法想象的東西。。

    posted on 2013-06-08 11:56 青菜貓(孫宇) 閱讀(20462) 評(píng)論(6)  編輯  收藏 所屬分類(lèi): java


    FeedBack:
    # re: java反射 修改靜態(tài)方法的值 setAccessible太無(wú)節(jié)操了
    2013-06-09 08:20 | 開(kāi)發(fā)吧
    寫(xiě)的一針見(jiàn)血,精品  回復(fù)  更多評(píng)論
      
    # re: java反射 修改靜態(tài)方法的值 setAccessible太無(wú)節(jié)操了
    2013-06-25 13:19 | ghyghost
    節(jié)操?何謂節(jié)操?求解釋  回復(fù)  更多評(píng)論
      
    # re: java反射 修改靜態(tài)方法的值 setAccessible太無(wú)節(jié)操了
    2014-01-18 15:19 | zzy8811
    jvm 加上安全管理期及相關(guān)策略即可防止。  回復(fù)  更多評(píng)論
      
    # re: java反射 修改靜態(tài)方法的值 setAccessible太無(wú)節(jié)操了
    2014-03-01 03:45 | BBB
    這么些會(huì)個(gè)屁的  回復(fù)  更多評(píng)論
      
    # re: java反射 修改靜態(tài)方法的值 setAccessible太無(wú)節(jié)操了
    2014-08-10 10:33 | 江奕銘
    這文章寫(xiě)的好!  回復(fù)  更多評(píng)論
      
    # re: java反射 修改靜態(tài)方法的值 setAccessible太無(wú)節(jié)操了
    2015-11-28 11:44 | 宋大傻
    @江奕銘
    寫(xiě)的真受用。見(jiàn)識(shí)了  回復(fù)  更多評(píng)論
      
    <2014年1月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    青菜貓(孫宇)結(jié)交天下朋友,在網(wǎng)上吸取知識(shí)..

    常用鏈接

    留言簿(16)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    青菜貓(孫宇博客),青菜貓(孫宇博客),青菜貓(孫宇博客)http://www.javasdc.cn/
    主站蜘蛛池模板: 国色精品va在线观看免费视频| 免费黄网在线观看| 成年人视频在线观看免费| 亚洲色欲久久久综合网| 无码色偷偷亚洲国内自拍| 国产免费AV片在线播放唯爱网| 亚洲Av无码精品色午夜| 青青青视频免费观看| 国产免费av一区二区三区| 亚洲av成人无码网站…| 国产无遮挡吃胸膜奶免费看| 亚洲 欧洲 日韩 综合在线| 131美女爱做免费毛片| 亚洲成年人电影网站| 亚欧人成精品免费观看| 亚洲激情中文字幕| 精品国产麻豆免费人成网站| 亚洲精品国产精品乱码不卞 | 久久久综合亚洲色一区二区三区| 国产一级a毛一级a看免费视频| 亚洲国产综合久久天堂| 永久在线观看www免费视频| 日本视频免费观看| 亚洲精品国产精品国自产网站| 在线精品一卡乱码免费| 亚洲中文字幕无码中文字| 成人超污免费网站在线看| 国产亚洲免费的视频看| 污视频网站在线免费看| 亚洲入口无毒网址你懂的| 亚洲成AV人片一区二区| 成人免费大片免费观看网站| 黄色视频在线免费观看| 亚洲视频精品在线观看| 野花高清在线观看免费3中文| 国产成人无码区免费内射一片色欲| 日韩亚洲人成网站| 亚洲熟女综合色一区二区三区| 亚洲老熟女@TubeumTV| 亚洲国产精品无码AAA片| 亚洲精品网站在线观看不卡无广告 |