AVA反射機制是在中,對于任意一個,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為java語言的反射機制。
反射的功能有:
在運作時檢測對象的類型;
動态構造某個類的對象;
檢測類的屬性和方法;
任意調用對象的方法;
修改構造函數、方法、屬性的可見性;
示例1:擷取對象的類型名稱。
輸出:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmL2AjNwMTN3UDNwEDMxADMxgTMwIzLcVDM0EDMy8CXvZmbp9CXt92YuUGZvNWatFWbuU2Zh1Wavw1LcpDc0RHaiojIsJye.jpg)
示例2:調用未知對象的方法。
在下列代碼中,設想對象的類型是未知的。通過反射,我們可以判斷它是否包含print方法,并調用它。
示例3:建立對象
運作結果:
示例4:擷取構造函數,并建立對象。
此外,你可以通過Class執行個體來擷取該類實作的接口、父類、聲明的屬性等。
示例5:通過反射來修改數組的大小。
Java
反射相關的API簡介:
位于java。lang。reflect包中
Filed類:代表類的成員變量
Constructor類:代表類的構造方法
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對象。
Class。getSuperclass():Class類中的方法,傳回該Class的父類的Class
Class:類名.class
運作時調用Field内容
變更Field不需要參數和自變量,首先調用Class的getField()并指定field名稱,獲得特定的Field對象後,便可以直接調用Field的
get(Object obj)和set(Object obj,Object value)方法
運作時生成instance
想生成對象的實體,在反射動态機制中有兩種方法,一個針對無變量的構造方法,一個針對帶參數的構造方法,,如果想調用帶參數的構造方法,就比較的麻煩,不能直接調用Class類中的newInstance(),而是調用Constructor類中newInstance()方法,首先準備一個Class[]作為Constructor的參數類型。然後調用該Class對象的getConstructor()方法獲得一個專屬的Constructor的對象,最後再準備一個Object[]作為Constructor對象昂的newInstance()方法的實參。
在這裡需要說明的是
隻有兩個類擁有newInstance()方法,分别是Class類和Constructor類Class類中的newInstance()方法是不帶參數的,而Constructro類中的newInstance()方法是帶參數的需要提供必要的參數。
例:
Class
c=Class.forName("DynTest");
Class[] ptype=new
Class[]{double.class,int.class};
Constructor
ctor=c.getConstructor(ptypr);
Object[] obj=new
Object[]{new Double(3.1415),new Integer(123)};
Object object=ctor.newInstance(obj);
System.out.println(object);