1. 什麼是Java反射機制
Java的反射機制是在程式運行時,能夠完全知道任何一個類,及其它的屬性和方法,並且能夠任意調用一個對象的屬性和方法。這種運行時的動態擷取就是Java的反射機制。其實這也是Java是動態語言的一個象徵。
用一句話來概括反射就是載入一個運行時才知道的類以及它的完整內部結構。
2. 為什麼要有Java反射機制
我們為什麼要用Java的反射機制呢?
我認為有兩種:
第一種:反射的目的就是為了擴充未知的應用。比如你寫了一個程式,這個程式定義了一些介面,只要實現了這些介面的dll都可以作為外掛程式來插入到這個程式中。那麼怎麼實現呢?就可以通過反射來實現。就是把dll載入進記憶體,然後通過反射的方式來調用dll中的方法。
第二種:在編碼階段不知道那個類名,要在運行期從設定檔讀取類名, 這時候就沒有辦法寫入程式碼new ClassName(),而必須用到反射才能建立這個對象。
一個生活中常看到的例子有助於理解我們為什麼要用Java的反射機制:你進了一家飯店,你不知道他們都有那些菜,要多少錢。那麼你第一件事情是幹啥“服務員拿個菜單過來”,然後指著菜單說“我要這個,我要那個”。
3. 一起來看ReflectionAPI
在生活中,我們使用一個未知的東西的時候總會用協助來解決我們的使用問題,電視機有協助,電腦有協助,幾乎所有的事物都攜帶著它的一本協助,Java的反射機制也不例外。
在JDK中有Reflection API的協助,它主要說明了什麼是Java反射機制,這種反射機制提供了什麼樣的屬性和方法,進一步我們能夠知道能夠通過它完成什麼樣的工作。
下面咱就一起看看這部分的API。這些介面和類都位於lang包裡。
介面:
類:
簡單介紹一些類和介面的用法。
1) Member成員是一種介面,反映有關單個成員(欄位或方法)或構造方法的標識資訊
2) InvocationHandler是代理執行個體的調用處理常式 實現的介面(這個介面的具體用法等到java反射機制剖析4著重介紹)
3) Method提供一個類的方法的資訊以及訪問類的方法的介面。
樣本:
import java.lang.reflect.Method;</p><p>public class TestMethod {</p><p>/**<br /> * @param args<br /> * @throws Exception<br /> */<br />public static void main(String[] args) throws Exception {<br />// TODO Auto-generated method stub<br />Class classType=Class.forName(args[0]);<br />Method methods[]=classType.getDeclaredMethods();<br />for(int i=0;i<methods.length;i++){<br />System.out.println(methods[i].toString());<br />}<br />}</p><p>}
4) Filed提供一個類的域的資訊以及訪問類的域的介面。
樣本:
import java.lang.reflect.Field;</p><p>public class TestField {</p><p>/**<br /> * @param args<br /> * @throws Exception<br /> */<br />public static void main(String[] args) throws Exception {<br />// TODO Auto-generated method stub<br />Class classType=Class.forName(args[0]);<br />Field[] fields = classType.getFields();<br />for(int i=0;i<fields.length;i++){<br />System.out.println(fields[i].toString());<br />}<br />}</p><p>}<br />
5) Array 類提供了動態建立和訪問 Java 數組的方法。
樣本:
import java.lang.reflect.Array;</p><p>public class TestArray {</p><p>public TestArray(){</p><p>}<br />/**<br /> * @param args<br /> * @throws Exception<br /> */<br />public static void main(String[] args) throws Exception {</p><p> Class<?> classType = Class.forName("java.lang.String");</p><p> Object array = Array.newInstance(classType, 10);</p><p> Array.set(array, 5, "hello");</p><p> String s = (String)Array.get(array, 5);<br /> System.out.println(s);</p><p>}</p><p>}
6) Proxy提供動態地組建代理程式類和類執行個體的靜態方法(這個方法在java放射機制剖析4著重介紹)。
其餘的類和介面的使用方法詳見API