JAVA反射機制(java reflect):
在JAVA運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法。對於任意一個對象,能否調用他的方法。這些答案是肯定的,這種動態擷取類的資訊,以及動態調用類的方法的功能來源於JAVA的反射。從而使JAVA具有動態語言的特性。
JAVA發射機制主要提供以下功能:
1、在運行時判斷任意一個對象所屬的類
2、在運行時構造任意一個類的對象
3、在運行時判斷任意一個類所具有的成員變數和方法(通過反射甚至可以調用private方法)
4、在運行時調用任意一個對象的方法(******注意:前提都是在運行時,而不是在編譯時間)
JAVA反射相關的API簡介:
位於java.lang.reflect包中
--Class類:代表一個類
--Filed類:代表類的成員變數
--Method類:代表類的方法
--Constructor類:代表類的構造方法
--Array類:提供了動態建立數組,以及訪問數組的元素的靜態方法。該類中的所有方法都是靜態方法
------Class類
在JAVA的Object類中的申明了數個應該在所有的JAVA類中被改寫的methods:hashCode(),equals(),clone(),toString(),getClass()等,其中的getClass()返回一個Class類型的對象。
Class類十分特殊,它和一般的類一樣繼承自Object,其實體用以表達java程式運行時的class和interface,也用來表達enum,array,primitive,Java Types以及關鍵字void,當載入一個類,或者當載入器(class loader)的defineClass()被JVM調用,便產生一個Class對象,Class是Reflection起源,針對任何你想探勘的class(類),唯有先為他產生一個Class的對象,接下來才能經由後者喚起為數十多個的反射API。
JAVA允許我們從多種途徑為一個類Class產生對應的Class對象。
--運用getClass():Object類中的方法,每個類都擁有此方法 String str = "abc"; Class cl = str.getClass();
--運用Class.getSuperclass():Class類中的方法,返回該Class的父類Class
--運用Class.forName()靜態方法:
--運用 .Class:類名.Class
--運用primitive wrapper classes的TYPE文法:基本類型封裝類TYPE,如:Integer.TYPE(注意TYPE的使用,只適合原生(基本)資料類型)
--運行時產生instance,想產生對象的實體,在反射動態機制中有兩種方法,一個針對無變數的構造方法,一個針對帶參數的構造方法,如果想調用帶參數的構造方法,就比較麻煩,不能直接調用Class類中的newInstance(),而是調用Constructor類中newInstance()方法,首先準備一個Class[]作為Constructor的參數類型。然後調用該Class對象的geiConstructor()方法獲得一個專屬的Constructor的對象,最後再準備一個Object[]作為Constructor對象一樣的newInstance()方法的實參。
在這裡需要說明的是只有兩個類擁有newInstance()方法,分別是Class類和Constructor類,其中Class類中的newInstance()方法是不帶參數的,而Constructro類中的newInstance()方法是帶參數的。