初識Java反射

weixin_34120274發表於2016-09-17

要詳細的瞭解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反射是個什麼,它怎麼用用在什麼地方,它的執行過程到底是怎麼樣的,它的原理是什麼等等還有待去深入學習。

 

相關文章