初識反射

目錄

 

1.認識反射機制:

2.三種實例化對象

3.反射與類操作:

4.ClassLoader類加載器


1.認識反射機制:

        反射:

        反射指的是對象的反向處理操作,所謂的額“反“指的是根據對象來取得對象的來源信息,而這個”反”的操作核心的處理就在於Object類的一個方法:

取得Class對象:

    Public fianl native Class<?> getClass();

    該方法返回的是一個Class類對象,這個Class描述的就是類。

在反射的世界裏面,看重的不再是一個對象,而是對象身後的組成(類、構造、普通成員等)

 

2.三種實例化對象

    Class類是描述整個類的概念,也是整個反射的操作源頭,在使用Class類的時候需要關注的依然是這個類的對象,而這個類的產生模式一共有三種:

  1. 任何類的實例化對象可以通過Object類中的getClass()方法取得Class類對象。
  2. “類.class”:直接根據某個具體的類來取得Class類的實例化對象
  3. 使用Class類提供的方法:public static Class<?> forName(String className) throws ClassNotFoundException

3.反射與類操作:

    1)取得父類信息:

       在Java中任何的程序都一定會有父類,在Class類中就可以通過如下方方法來取得父接口或者實現的父接口:

  1. 取得類的包名稱:public Package getPackage()
  2. 取得父類的Class對象:public native Class<? Super T> getSuperclass();
  3. 取得實現的父接口:public Class<?>[] getInterfaces();

   2)反射調用構造

   一個類中可以存在多個構造方法,如果想要取得類中構造的嗲用,就可以使用Class類中提供的兩個方法:

取得指定參數類型的構造:

Public  Constructor<T> getConstructor(Class<?>… paramenterTypes)throws NoSuchMethodException,SecurityException

Class類通過反射實例化類對象的時候,只能嗲用類中的無參構造。如果現在類中沒有無參構造則無法使用Class類調用,只能夠通過明確的構造調用實例化處理。

    3)反射調用普通方法(核心)

       類中普通方法的反射調用你在開發之中一定會使用到,並且使用好了可以計生大量的重複編碼。在Class類中有如下兩種取得類中普通女方法的函數:

取得全部普通方法

Public Method[] getMethods() throws SecurityException

取得指定普通方法:

Public Method getMethod(String name,class<?>… parameterTypes)

調用

   4)反射調用類中屬性:

在之前已經成功的實現了類的構造調用、方法調用,除了這兩隻能夠模式之外還有類中屬性調用。

前提:類中的所有屬性一定在類對象實例化之後曹輝進行空間分配,所以此時如果想要嗲用類的屬性,必須保證有實例化對象。通過反射的newInstance()可以直接取得實例化對象(Object類型)

在Class類中提供有兩組取得屬性的方法:

    a.(父類中取得類的全部屬性):public Filed[] getFileds() throws SecurityException

    b.(父類中取得類中全部屬性):public Filed getFiled(String name)throws NoSuchFiledException,SecurityExceptio

    c.(本類中,取得類中全部屬性):public Filed[] getDeclaredFileds()throws Securityexception

    d.(本類中,取得類中指定名稱屬性):public Method  getDeclaredMethod(String name,Class<?>…parameter Types)throws NoSuchMethodException,SecurityException

4.ClassLoader類加載器

       Class類描述的是整個類的信息,在class類中提供的forName()方法,這個方法根據和ClassPath配置的路徑進行類的加載,如果說現在你的類加載路徑可能是網絡、文件,這個時候就必須實現類加載器,也就是ClassLoader類的主要作用。

 

   4.1 類加載器的定義:

    JVM設計團隊把類加載階段中的“通過一個類的全限定名來獲取描述此類的二進制字節流”這個動作放在java 虛擬機外部去實現,以便讓應用程序自己決定如何去獲取所需要的類。實現這個動作的代碼模塊稱之爲“類加載器”。

 

    Bootstrap(類加載器):這個類加載器使用C++實現,是虛擬機自身的一部分;其他的類加載器都由Java語言實現,獨立於JVM外部並且都繼承於java.lang.ClassLoader.BootStrap類加載器負責存放與<Java_HOME>\lib目錄中(或者被-Xbootclasspath參數指定路徑中)能被虛擬機識別的僅按照文件名識別,如rt.jar,名字不符合的類庫及時放在lib目錄中也不會被加載)類庫加載到JVM內存中。啓動類中加載器無法被java 程序直接引用。 

   

    ExtClassLoader(擴展類加載器):它負責加載<Java_HOME>\lib\ext目錄中,或者直接被java.ext.dirs系統變量指定的路徑中的類庫。開發者可以直接使用擴展類加載器。

 

    AppClassLoader(應用程序類加載器):負責加載用戶路徑(ClassPath)上指定的類庫,如果應用程序中沒喲自定義自己的類加載器,則此加載器就是程序中默認的類加載器。

 

  4.2  雙親委派模型

    我們的應用程序都是由這三種加載器互相配合進行加載的,如果有必要,還可以加入自定義的類加載器。

雙親委派模型要求除了頂層的父類加載器外,其餘的類加載器都應有自己的父類加載器。

 

      雙親委派模型的工作流程是:如果一個類加載器收到來加載請求,它首先不會自己去嘗試加載這個類。而是把這個請求委託給父類加載器去完成,每一個層次的類加載器都是如此。因此,所有的加載請求都應當傳送到頂層的BootStrap加載器中,只有當父類加載器反饋無法完成這個類加載器請求時(在自己搜索範圍中沒有找到此類),子加載器纔會嘗試自己去加載。

 

      類加載器的雙親委派模型從JDK1.2引入後廣泛應用之後幾乎所有的Java程序中,但它並不是強制性約束,甚至可以破 壞雙親委派模型來進行類加載,最典型的就是OSGI技術。

      雙親委派模型模式對於保證Java程序的穩定性運行很重要。有一個顯而易見的好處就是Java類隨着它的類加載器一起具備了一種帶有優先級的層次關係。例如java.lang.Object類,它存放在rt.jar中,無論哪一個類加載器要加載這個類,最終都是委派給處於頂端的啓動類加載器進行加載。因此,Object類在程序的各種類加載環境中都是同一個類。

 

   

 

發佈了81 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章