對於反射中的invoke()方法的理解


先講一下java中的反射:

反射就是將類別的各個組成部分進行剖析,可以得到每個組成部分,就可以對每一部分進行操作

在比較復雜的程序或框架中來使用反射技術,可以簡化代碼提高程序的復用性。

講的是Method類的invoke()方法。

5

既然是講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);
    }
}

測試會報錯:

1

紅色框框顯示是參數錯誤,test方法需要是字符串數組啊,我傳遞也是字符串數組,怎么就不對了??

讓我們來看一下invoke方法:

2

invoke方法的參數,一個是Object類型,也就是調用該方法的對象,

第二個參數是一個可變參數類型,這個可變參數類型怎么能傳遞給一個數組類型呢?一個是多個參數。一個是一個數組參數,顯然參數的個數不匹配,怎么解決呢?

解決辦法就是將可變參數變成一個參數:

  1. 將傳遞進去的s強轉為Object類型
  2. 將s重新包裝成一個Object數組

測試一下:

3

結果可行。

【點擊此處回到主頁】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM