簡體   English   中英

通過反射調用私有靜態方法

[英]Invoking by reflection a private static method

當我在私有靜態方法上調用 java.lang.reflect.Method.invoke() 方法時,我得到一個“java.lang.IllegalArgumentException:參數數量錯誤”。 我想我尊重 javadoc 規范,我做錯了什么嗎? 謝謝你的幫助。

這是我的代碼:

public class MyClass {
    ....
    private static Object myMethod(String[] stringArray) {...}
}

我想在 JUnit 測試類中測試 myMethod():

public class MyClassTest {
    private static String[] myArray = {"A", "B", "C"};
    @Test
    public void myMethodTest() {
        Method method = Class.forName("mypackage.MyClass").getDeclaredMethod("myMethod", myArray.getClass());
        method.setAccessible(true);
        method.invoke(null, myArray);
    }
}

由於invoke()將 vararg 作為參數,Java 編譯器將您傳遞的數組的每個元素視為 vararg 參數,即它認為它等效於

method.invoke(null, "A", "B", "C");

您可以將數組強制轉換為對象來解決問題:

method.invoke(null, (Object) myArray);

您需要將String包裝在一個對象數組中:

Method method = Class.forName("mypackage.MyClass")
        .getDeclaredMethod("myMethod", myArray.getClass());
method.setAccessible(true);
method.invoke(null, new Object[] {myArray});

method.invoke()的第二個參數需要方法參數的數組或可變參數。 對於你的方法,你只有一個參數(它也恰好是一個數組),但你仍然需要將它包裝在一個數組中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM