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

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

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

    andy-j2ee  
    JAVA
    公告
    • 在夜深人靜的時候,偶彈起心愛的土琵琶,唱起那動人的歌謠(柯受良-《大哥》):偶寫了代碼好多年,偶不愛冰冷的床沿,不要逼偶想念,不要逼偶流淚,偶會翻。
    日歷
    <2011年11月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910
    統計
    • 隨筆 - 19
    • 文章 - 1
    • 評論 - 1
    • 引用 - 0

    導航

    常用鏈接

    留言簿

    隨筆分類(5)

    隨筆檔案(19)

    文章分類(1)

    文章檔案(1)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     
        以前一直只知道有reflect這么一個類是用來反射的,聽人家說java中的反射很難,晚上聽罷張老師講的反射這一節的內容,惶然大悟,原來反射就是把Java類中的各種成分映射成相應的java類。    
        反射的基礎是要掌握Class這個類的,具體Class的類是干什么的,下面是api文檔中的解釋
       
    api中關于Class類的一段描述
    Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
    翻譯成中文
    Class 類的實例表示正在運行的 Java 應用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個數組屬于被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。基本的 Java 類型(booleanbytecharshortintlongfloatdouble)和關鍵字 void 也表示為 Class 對象。
        可以看出Class類就是一個類或者接口對象的一個實例在內存中的字節碼,而如何得到一個類的字節碼呢?其方法有三:
    1         Class<? extends String> cls1 = str1.getClass();
    2         Class<String> cls2 = String.class;
    3         Class<?> cls3 = Class.forName("java.lang.String");
        而Class的isPrimitive()方法就是用來判斷一個類的字節碼是不是9個預定義的class
        
        接下來是Constructor類,Constructor類代表某個類中的一個構造方法。
       得到某個類所有的構造方法: 例子
    Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
      
        得到某一個構造方法:
       例子:
    Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);//獲得方法時要用到類型
     
        創建實例對象:
    //通常方式:
    String str = new String(new StringBuffer("abc"));
        
    //反射方式: 
    String str = (String)constructor.newInstance(new StringBuffer("abc"));//調用獲得的方法時要用到上面相同類型的實例對象
       
        Class.newInstance()方法:
       例子:
    String obj = (String)Class.forName("java.lang.String").newInstance();
        該方法內部先得到默認的構造方法,然后用該構造方法創建實例對象。
       該方法內部的具體代碼是怎樣寫的呢?用到了緩存機制來保存默認構造方法的實例對象。
       

    下面是一個Field反射的綜合實例
    將任意一個對象中的所有String類型的成員變量所對應的字符串內容中的"b"改成"a"。 
    首先定義一個ReflectPoint的類
     1 package com.anduo.day1;
     2 
     3 public class ReflectPoint {
     4     private int x;
     5     public int y;
     6     public String a = "ball";
     7     public String b = "basketball";
     8     public String c = "hello";
     9 
    10     public ReflectPoint(int x, int y) {
    11         super();
    12         this.x = x;
    13         this.y = y;
    14     }
    15 
    16     @Override
    17     public String toString() {
    18         return "a=" + a + ";b=" + b + ";c=" + c;
    19     }
    20 }
    21 

    下面的步驟是:先從對象中得到所有為String類型的字段,2:得到Sting字段的值;3:用String類的replace方法代換a字符為b字符;4:把對象的String字段設置為修改完的新String。
    齊活兒
     1 package com.anduo.day1;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Field;
     5 
     6 public class ReflectTest {
     7 
     8     
     9     public static void main(String[] args) throws Exception {
    10 
    11         
    12         /**
    13          * 成員變量的反射 Field
    14          */
    15         System.out.println("**成員變量的反射 Field**");
    16         ReflectPoint pt1 = new ReflectPoint(1-1);
    17         Field fieldY = pt1.getClass().getField("y");
    18         // fieldY 不是對象身上的變量,而是類上,要用它來去對象上字段的值
    19         System.out.println("p1 中  y = " + fieldY.get(pt1));
    20         Field fieldX = pt1.getClass().getDeclaredField("x");// 獲取私有屬性字段
    21         fieldX.setAccessible(true);// 暴力反射
    22         System.out.println("p1 中  x = " + fieldX.get(pt1));
    23 
    24         /**
    25          * 將任意一個對象中的所有String類型的成員變量所對應的字符串內容中的"b"改成"a"
    26          */
    27         changeStringValue(pt1);
    28         System.out.println(pt1);
    29     }
    30 
    31     /**
    32      * 將任意一個對象中的所有String類型的成員變量所對應的字符串內容中的"b"改成"a"
    33      * @param obj
    34      * @throws IllegalArgumentException
    35      * @throws IllegalAccessException
    36      */
    37     private static void changeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException {
    38         Field[] fields = obj.getClass().getFields();
    39         for (Field field : fields) {
    40             // if(field.getType().equals(String.class))
    41             if (field.getType() == String.class) {
    42                 String oldValue = (String) field.get(obj);
    43                 String newValue = oldValue.replace('a''b');
    44                 field.set(obj, newValue);
    45             }
    46         }
    47     }
    48 
    49 }
    50 
    結果如下
    **成員變量的反射 Field**
    p1 中  y 
    = -1
    p1 中  x 
    = 1
    a
    =bbll;b=bbsketbbll;c=hello

    綜上可以看出,其實反射也沒多難,人家那些寫框架的也不就是用了些反射嗎?把配置文件中的東西讀出來,然后再調用下面的類去做應該做的事情,當然這個過程就用到了反射了。

    posted on 2011-11-07 20:58 安多 閱讀(319) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
     
    Copyright © 安多 Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 无遮挡免费一区二区三区| 亚洲成在人线在线播放无码| 国产成人1024精品免费| 国产在线观看免费视频播放器| 亚洲日韩精品无码专区加勒比| 在线观看免费a∨网站| 亚洲日本成本人观看| 成人五级毛片免费播放| 亚洲国产精品18久久久久久| 成人免费在线视频| 久久无码av亚洲精品色午夜| 国产精品无码一二区免费| 国产精品亚洲二区在线| 亚洲无码精品浪潮| 国产一区二区三区免费观看在线| 国产亚洲美女精品久久久久狼| 免费人成网站在线观看不卡| 亚洲视频一区网站| 天天看免费高清影视| 美女视频黄频a免费大全视频| 免费乱码中文字幕网站| 成在人线av无码免费高潮水| 亚洲AV人人澡人人爽人人夜夜| 最近免费视频中文字幕大全| 亚洲永久在线观看| 免费v片视频在线观看视频| av成人免费电影| 亚洲视频一区在线播放| 国产99视频精品免费视频7| 插鸡网站在线播放免费观看| 亚洲美女免费视频| 日本xxwwxxww在线视频免费| 国产日韩AV免费无码一区二区三区| 久久亚洲成a人片| 女人毛片a级大学毛片免费| 中美日韩在线网免费毛片视频| 91亚洲国产在人线播放午夜| 国产精品视_精品国产免费| a级成人毛片免费图片| 精品久久久久久亚洲精品| 国产亚洲自拍一区|