JAVA學習筆記——反射__JAVA

來源:互聯網
上載者:User

1.類載入器
  A.類載入器
    負責將.class檔案載入到內在中,並為之產生對應的Class對象。
    雖然我們不需要關心類載入機制,但是瞭解這個機制我們就能更好的理解程式的運行。
  B.類載入器的組成
    Bootstrap ClassLoader 根類載入器
    Extension ClassLoader 擴充類載入器
    Sysetm ClassLoader 系統類別載入器
2.反射
  A .JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。
  B .要想解剖一個類,必須先要擷取到該類的位元組碼檔案對象。而解剖使用的就是Class類中的方法.所以先要擷取到每一個位元組碼檔案對應的Class類型的對象.
  Class類:
    成員變數: Field
    構造方法: Constructor
    成員方法: Method
  C .擷取Class檔案對象的方式:
    a.Object類的getClass()方法 p.getClass()
    b.資料類型的靜態屬性 Person.class
    c.Class類中的靜態方法
      public static Class forName(String className) ;//className是包名.類名
    
    註:一般使用第三種方式,因為第三種返回的是一個字串,而不是一個具體的類名,這樣可以把字串配置到設定檔中去。
  
3.通過反射擷取構造方法並建立對象過程
   A.擷取位元組碼檔案:使用Class.forName()方法
    static Class< ?> forName(String className) :返回與帶有給定字串名的類或介面相關聯的 Class 對象。
   B.擷取構造方法對象
     Constructor< T> getConstructor(Class< ?>… parameterTypes) :返回一個 Constructor 對象,它反映此 Class 對象所表示的類的指定公用構造方法。
     Constructor< ?>[] getConstructors() :返回一個包含某些 Constructor 對象的數組,這些對象反映此 Class 對象所表示的類的所有公用構造方法。
      Constructor< T> getDeclaredConstructor(Class< ?>… parameterTypes) :返回一個 Constructor 對象,該對象反映此 Class 對象所表示的類或介面的指定構造方法。
      Constructor< ?>[] getDeclaredConstructors() :返回 Constructor 對象的一個數組,這些對象反映此 Class 對象表示的類聲明的所有構造方法。
   C.使用Constructor的newInstance()方法建立對象
      T newInstance(Object… initargs) :使用此 Constructor 對象表示的構造方法來建立該構造方法的聲明類的新執行個體,並用指定的初始化參數初始化該執行個體。
    如果想要擷取private構造方法對象,可以對Constructor對象先設定暴力訪問
      public void setAccessible(boolean flag) throws SecurityException :將此對象的 accessible 標誌設定為指示的布爾值。值為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。

        //擷取位元組碼對象        Class c = Class.forName("cn.zsl.Person") ;        //擷取帶參構造方法        Constructor con = c.getDeclaredConstructor(String.class,int.class) ;        //建立對象        Object obj = con.newInstance("張三" , 25) ;        System.out.println(obj);   //Person [name="張三" , age=25]

4.通過反射擷取成員變數過程
  A.擷取構造方法並建立對象
  B.通過位元組碼Class對象的方法擷取成員變數
     Field getField(String name) :返回一個 Field 對象,它反映此 Class 對象所表示的類或介面的指定公用成員欄位。
     Field[] getFields() :返回一個包含某些 Field 對象的數組,這些對象反映此 Class 對象所表示的類或介面的所有可訪問公用欄位。
      Field getDeclaredField(String name) :返回一個 Field 對象,該對象反映此 Class 對象所表示的類或介面的指定已聲明欄位。
      Field[] getDeclaredFields() :返回 Field 對象的一個數組,這些對象反映此 Class 對象所表示的類或介面所聲明的所有欄位。
   C.通過Filed對象方法將指定物件變數上此Field對象表示的欄位值設定為指定的新值
     void set(Object obj, Object value) :將指定物件變數上此 Field 對象表示的欄位設定為指定的新值。
     如果要訪問對象的私人變數,也可以使用Field的暴力訪問
     public void setAccessible(boolean flag) throws SecurityException :將此對象的 accessible 標誌設定為指示的布爾值。值為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。
     

        //擷取位元組碼對象        Class c = Class.forName("cn.zsl.Person") ;        //擷取帶參構造方法        Constructor con = c.getDeclaredConstructor() ;        //建立對象        Object obj = con.newInstance() ;        //擷取單個成員變數        Field nameField = c.getField("name") ;        Field ageField = c.getField("age") ;        //將指定物件變數上此Field對象表示的欄位值設定為指定的新值        nameField.set(obj, "張三");        Integer i= new Integer(25);        ageField.set(obj, i);        System.out.println(obj);   //Person [name="張三" , age=25]

5.通過反射擷取成員方法
  A.擷取構造方法並建立對象
  B.通過位元組碼對象擷取方法對象
     Method getMethod(String name, Class< ?>… parameterTypes) :返回一個 Method 對象,它反映此 Class 對象所表示的類或介面的指定公用成員方法。
     Method[] getMethods() :返回一個包含某些 Method 對象的數組,這些對象反映此 Class 對象所表示的類或介面(包括那些由該類或介面聲明的以及從超類和超介面繼承的那些的類或介面)的公用 member 方法。
     Method getDeclaredMethod(String name, Class< ?>… parameterTypes) :返回一個 Method 對象,該對象反映此 Class 對象所表示的類或介面的指定已聲明方法。 第一個參數表示方法名,第二個參數表示該方法的參數的class類型,無參方法則不需要第二個參數
    Method[] getDeclaredMethods() : 返回 Method 對象的一個數組,這些對象反映此 Class 對象表示的類或介面聲明的所有方法,包括公用、保護、預設(包)訪問和私人方法,但不包括繼承的方法。
  C.通過方法對象調用對象的該方法
     Object invoke(Object obj, Object… args) :對帶有指定參數的指定對象調用由此 Method 對象表示的底層方法。 第一個參數表示要調用的對象,第二個參數表示調用該方法的實際參數。無參方法則不需要第二個參數

        // 擷取位元組碼對象        Class c = Class.forName("cn.zsl.Person");        // 擷取帶參構造方法        Constructor con = c.getDeclaredConstructor();        // 建立對象        Object obj = con.newInstance(null);        // 擷取單個成員方法        Method m = c.getMethod("show", String.class);        // 調用對象的該方法,因為不確定會返回什麼值,所以傳回值用Object接收        Object objString = (String)m.invoke(obj, "張三"); // =obj.show("張三")

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.