1. 程式人生 > >JAVA 反射機制剖析

JAVA 反射機制剖析

一、Class、Object 類的理解

   Object類位於在java.lang包中,此包在使用時無需顯式匯入,編譯時由編譯器自動匯入;Object類預設為所有類的父類即所有的java類都繼承了Object擁有的方法,其中一個與JAVA反射機制有關的方法是getClass(),此方法返回當前物件的執行時類,然後通過使用此類實現反射的其它功能。

   Class類表示正在執行應用程式中的類和介面;Class沒有public的構造方法所以只能由java虛擬機器或者呼叫類載入器的defineClass方法生成Class物件;通過生成的Class物件完成其它反射功能。

二、反射的理解及可完成的工作

   java語言不支援在程式執行時改變程式結構或者變數的值,但它提供了一種機制可使正在執行的java物件得到其類定義方法、變數並可通過此機制動態的新增及執行發放的機制,這種機制我們稱之為java的反射機制。

   java的反射機制具體來說可實現以下4種功能:

   1、根據執行物件得到完整類名

   2、得到執行物件類的方法包括構造方法

   3、得到類生成物件

   4、得到類定義的公用變數

三、反射的具體使用方法

  1、得到執行物件類的Class例項。

      可通過以下多種方式獲取Class例項

      a)、在執行時物件中可通過呼叫超類方法getClass()得到Class例項,如下:

           String str = "";

           Class c1 = str.getClass;

      b)、通過Class類的靜態方法forName("");

           Class c1 = Class.forName ("java.lang.String");

              c)、 通過包裝類的TYPE屬性

                          Class c1 = Integer.TYPE;

   2、獲取類的構造方法並構造一個新物件 執行某個方法       

public class Test {

public static void main(String [] args) throws ClassNotFoundException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{

   Class c = Class.forName("t");

   Constructor[]  con = c.getConstructors();

   Class<?>[] type = con[1].getParameterTypes();

   Object obj = c.getConstructor(type).newInstance("zhang");

   obj.getClass().getMethod("m2").invoke(obj);

   }

}

class t{

   String s = "";

   public t(){

       System.out.println("t()");

   }

   public t(String sr){

       this.s = sr;

   }

   public void m1(){

       System.out.println("m1()");

   }

   public void m2(){

       System.out.println(s);

   }

}

反射可實現的其他功能可JDK文件實現。