<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
    這幾天閑來無事。在網上看了一個題目,相信大家都知道這個題目
     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);這結果改了,但是改的代碼太多。、
    我想只能改change方法。也不需要返回值,來解決問題。先看了下
    String類發現 private final char value[]; 是私有的。把這個值改了不就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();
            }
        }
    發現打出結果 welcome 那么只要改掉
    charValue就OK了吧。于是繼續加代碼 發現 modifiers "private final" 會出這個錯,
    要加上
        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();
            }
    }發現能滿足我的要求,。值是被改了,然后我想改變長度,于是又動一下代碼charValue = new char [4];
    發現值不能改變 繼續看String源碼,發現有個count屬性,。于是又了改了這個值代碼如下

     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();
            }
        }
    發現能解決問題。
    我又試了下
    然后我又試下Integer 發現一樣可以
    代碼如下:
    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();
            }
        }
    個人覺得只要Field.setAccessible(true); 之后,即使是final關鍵字標示過得屬性也可以有訪問權限!這樣的反射會改變JAVA的結構,甚至你的代碼可維護性,你完全可以
    改別的代碼里面的值 ,所以這只是一個簡單的例子。只是驗證通過反射能做一些讓你無法想象的東西。。

    posted on 2013-06-08 11:56 青菜貓(孫宇) 閱讀(20460) 評論(6)  編輯  收藏 所屬分類: java


    FeedBack:
    # re: java反射 修改靜態方法的值 setAccessible太無節操了
    2013-06-09 08:20 | 開發吧
    寫的一針見血,精品  回復  更多評論
      
    # re: java反射 修改靜態方法的值 setAccessible太無節操了
    2013-06-25 13:19 | ghyghost
    節操?何謂節操?求解釋  回復  更多評論
      
    # re: java反射 修改靜態方法的值 setAccessible太無節操了
    2014-01-18 15:19 | zzy8811
    jvm 加上安全管理期及相關策略即可防止。  回復  更多評論
      
    # re: java反射 修改靜態方法的值 setAccessible太無節操了
    2014-03-01 03:45 | BBB
    這么些會個屁的  回復  更多評論
      
    # re: java反射 修改靜態方法的值 setAccessible太無節操了
    2014-08-10 10:33 | 江奕銘
    這文章寫的好!  回復  更多評論
      
    # re: java反射 修改靜態方法的值 setAccessible太無節操了
    2015-11-28 11:44 | 宋大傻
    @江奕銘
    寫的真受用。見識了  回復  更多評論
      
    <2014年3月>
    2324252627281
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    青菜貓(孫宇)結交天下朋友,在網上吸取知識..

    常用鏈接

    留言簿(16)

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    青菜貓(孫宇博客),青菜貓(孫宇博客),青菜貓(孫宇博客)http://www.javasdc.cn/
    主站蜘蛛池模板: 亚洲国产精品高清久久久| 久久精品国产亚洲av麻豆小说| 久久国产乱子伦精品免费午夜| 亚洲av无码一区二区三区乱子伦 | 久久精品国产亚洲AV果冻传媒| 亚洲黄色片免费看| 亚洲日韩精品无码专区加勒比| 亚洲国产精品无码久久青草| 免费国产高清视频| 光棍天堂免费手机观看在线观看| 亚洲人成在线免费观看| 亚洲XX00视频| 在免费jizzjizz在线播| 黄页网站在线免费观看| 亚洲伊人tv综合网色| 男人的天堂亚洲一区二区三区 | 亚洲AV无码成人网站在线观看| 亚洲综合另类小说色区色噜噜| 美女视频黄的全免费视频| h视频在线观看免费| 亚洲国产91在线| 亚洲国产精品自在线一区二区| 国产成人高清精品免费鸭子| 88av免费观看| 久久精品无码免费不卡| 亚洲av无码兔费综合| 4444亚洲国产成人精品| 中文字幕不卡亚洲| 国产日产成人免费视频在线观看| 三年片在线观看免费观看大全动漫| 精品成人一区二区三区免费视频| 国产中文字幕免费| 在线观看成人免费视频不卡| 中文字幕免费在线看线人动作大片| 亚洲精品蜜夜内射| 亚洲乱码日产精品BD在线观看| 亚洲欧洲无码AV电影在线观看| 免费a级毛片无码av| 女人18一级毛片免费观看| 最近中文字幕高清免费中文字幕mv | 一区二区在线视频免费观看|