天天看點

黑馬程式員-基礎加強-反射

AVA反射機制是在中,對于任意一個,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為java語言的反射機制。

反射的功能有:

在運作時檢測對象的類型;

動态構造某個類的對象;

檢測類的屬性和方法;

任意調用對象的方法;

修改構造函數、方法、屬性的可見性;

 示例1:擷取對象的類型名稱。

輸出:

黑馬程式員-基礎加強-反射

示例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);