要詳細的瞭解Java反射,就得要了解Java的類載入以及何為執行時動態載入等等概念。本文拋開其餘概念,簡單介紹Java反射,詳細介紹會在以後有一個系統而全面的認識過後展開。
反射是Java被視為動態語言的關鍵,它允許程式在執行時取得任何類的內部資訊。Java的這個能力或許在Web應用中用得不是很多,但在一些Java元件開發過程中非常常見,比如Spring、Hibernate等都以此為基礎。瞭解並熟知Java反射機制對我們瞭解Java框架有很大的幫助。
我們首先寫好一個Test類,並將它編譯為class位元組碼。
1 /** 2 * @author turbo 3 * 4 * 2016年9月17日 5 */ 6 public class Test { 7 public void test(){ 8 System.out.println("類載入反射測試"); 9 } 10 }
編譯好過後,我們在eclipse中另外新建一個包並新建一個Main.java類,將此Test.class檔案放入eclipse工作空間的.bin目錄的該資料夾類。此時我們在eclipse的工程中看到的目錄如下:
我們在eclipse的工作空間的.bin目錄看到的檔案如下:
我們通常的寫法是兩個Java檔案互相呼叫,現在只有class檔案,要怎麼來呼叫Test類中的方法呢?我們來看看Main.java類是怎麼做到的。
1 package day_12_class; 2 3 import java.lang.reflect.Method; 4 5 /** 6 * @author turbo 7 * 8 * 2016年9月17日 9 */ 10 public class Main { 11 12 /** 13 * @param args 14 * 15 */ 16 public static void main(String[] args) throws Exception { 17 Class<?> clazz = Class.forName("Test"); 18 Object object = clazz.newInstance(); 19 Method method = clazz.getMethod("test"); 20 method.invoke(object); 21 } 22 23 }
首先來了解Class類是什麼,JVM通常使用執行時型別資訊選擇正確方法去執行,用來儲存這些型別資訊的類就是Class類。每個Java類在執行時在JVM裡都表現為一個Class物件,如上表示可通過呼叫靜態方法forName通過Test類名返回Class物件。此時還是Class物件,注意它不是Object類,通過呼叫Class的newInstance方法來返回一個例項。
Method類提供關於類或介面上某個方法的資訊,它用來封裝反射類方法的一個類。同樣通過Class的getMethod方法傳入方法名來返回Method類。關於getMethod方法的API描述如下:
獲取Method類後我們呼叫invoke方法即可執行Test類中的test方法。關於invoke方法的API如下:
最後我們來看看執行結果:
成功利用Java反射機制呼叫Test類中的方法。
由於對Java反射、類載入等知識認識得還不夠全面和深入,不敢在此亂講,所以這裡只初始Java反射是個什麼,它怎麼用用在什麼地方,它的執行過程到底是怎麼樣的,它的原理是什麼等等還有待去深入學習。