天天看點

JAVA反射詳解

什麼是Java的反射?

   大家都知道,要讓Java程式能夠運作,那麼就得讓Java類要被Java虛拟機加載。Java類如果不被Java虛拟機加載,是不能正常運作的。現在我們運作的所有的程式都是在編譯期的時候就已經知道了你所需要的那個類的已經被加載了。Java的反射機制是在編譯并不确定是哪個類被加載了,而是在程式運作的時候才加載、探知、自審。使用在編譯期并不知道的類。這樣的特點就是反射。

Java反射有什麼作用?

假如我們有兩個程式員,一個程式員在寫程式的時候,需要使用第二個程式員所寫的類,但第二個程式員并沒完成他所寫的類。那麼第一個程式員的代碼能否通過編譯呢?這是不能通過編譯的。利用Java反射的機制,就可以讓第一個程式員在沒有得到第二個程式員所寫的類的時候,來完成自身代碼的編譯。Java的反射機制它知道類的基本結構,這種對Java類結構探知的能力,我們稱為Java類的“自審”。大家都用過Jcreator和eclipse。當我們建構出一個對象的時候,去調用該對象的方法和屬性的時候。一按點,編譯工具就會自動的把該對象能夠使用的所有的方法和屬性全部都列出來,供使用者進行選擇。這就是利用了Java反射的原理,是對我們建立對象的探知、自審。

Class類

要正确使用Java反射機制就得使用java.lang.Class這個類。它是Java反射機制的起源。當一個類被加載以後,Java虛拟機就會自動産生一個Class對象。通過這個Class對象我們就能獲得加載到虛拟機當中這個Class對象對應的方法、成員以及構造方法的聲明和定義等資訊。

反射API

擷取一個對象的類資訊.

擷取一個類的通路修飾符、成員、方法、構造方法以及超類的資訊.

檢獲屬于一個接口的常量和方法聲明.

建立一個直到程式運作期間才知道名字的類的執行個體.

擷取并設定一個對象的成員,甚至這個成員的名字是在程式運作期間才知道.

檢測一個在運作期間才知道名字的對象的方法

利用Java反射機制我們可以很靈活的對已經加載到Java虛拟機當中的類資訊進行檢測。當然這種檢測在對運作的性能上會有些減弱,是以什麼時候使用反射,就要靠業務的需求、大小,以及經驗的積累來決定。

代碼示例:

擷取類執行個體

Class clazz = Class.forName(classInfo);//根據類的全路徑進行類加載,傳回該類的Class對象

方法

Method[] method = clazz.getDeclaredMethods();//利用得到的Class對象的自審,傳回方法對象集合

Method method = clazz.getMethod("methodName", new Class[]{int.class,int.class});

methodSize.invoke(obj,new Object[]{new Integer(300),new Integer(300)});

屬性

Field[] field = clazz.getDeclaredFields();//利用得到的Class對象的自審,傳回屬性對象集合

執行個體化對象

//無參數

Object obj = clazz.newInstance();

//有參數

Class[] cl = new Class[]{int.class,int.class};//設定Class對象數組,用于指定構造方法類型

Constructor con = cla.getConstructor(cl);//獲得Constructor構造器對象。并指定構造方法類型

Object[] x = {new Integer(33),newInteger(67)};//給傳入參數賦初值

Object obj = con.newInstance(x);//得到執行個體

詳細:http://boxipo.blog.163.com/blog/static/758097532008317105034340/

本文轉自 古道卿 51CTO部落格,原文連結:http://blog.51cto.com/gudaoqing/1272414

繼續閱讀