深入解析Java中反射中的invoke()方法
先講一下java中的反射:
反射就是將類別的各個組成部分進行剖析,可以得到每個組成部分,就可以對每一部分進行操作
反射機制應用場景:逆向代碼、動態生成類框架等,使用反射機制能夠大大的增強程序的擴展性。
反射的基本步驟:首先獲得Class對象,然後實例化對象,獲得類的屬性、方法或者構造函數,最後訪問屬性、調用方法、調用構造函數創建對象。而invoke()方法就是用來執行指定對象的方法。
在比較復雜的程序或框架中來使用反射技術,可以簡化代碼提高程序的復用性。
講的是Method類的invoke()方法。
既然是講invoke方法,那就不講怎麼使用反射瞭,代碼上來先:
package online; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.junit.Test; public class Msym { public void test(String[] arg){ for (String string : arg) { System.out.println(string); } } @Test public void demo1() throws Exception { //獲取字節碼對象 Class<Msym> clazz = (Class<Msym>) Class.forName("online.Msym"); //獲取一個對象 Constructor con = clazz.getConstructor(); Msym m = (Msym) con.newInstance(); String[] s = new String[]{"aa","bb"}; //獲取Method對象 Method method = clazz.getMethod("test", String[].class); //調用invoke方法來調用 method.invoke(m, s); } }
測試會報錯:
紅色框框顯示是參數錯誤,test方法需要是字符串數組啊,我傳遞也是字符串數組,怎麼就不對瞭??
讓我們來看一下invoke方法:
invoke方法的參數,一個是Object類型,也就是調用該方法的對象,
第二個參數是一個可變參數類型,這個可變參數類型怎麼能傳遞給一個數組類型呢?一個是多個參數。一個是一個數組參數,顯然參數的個數不匹配,怎麼解決呢?
解決辦法就是將可變參數變成一個參數:
- 將傳遞進去的s強轉為Object類型
- 將s重新包裝成一個Object數組
測試一下:
結果可行。
作者:碼上猿夢
出處:http://www.cnblogs.com/daimajun/
到此這篇關於深入解析Java中反射中的invoke()方法的文章就介紹到這瞭,更多相關Java invoke()內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java的invoke方法的具體使用
- Java基礎篇之反射機制詳解
- Java 全面系統介紹反射的運用
- Java如何通過反射獲取Constructor、Field、Method對象
- 新手瞭解java 反射基礎知識