簡體   English   中英

使用 Java 調用調用方法時出現 IllegalArgumentException

[英]IllegalArgumentException when calling invoke method using Java Reflections

我有一個 class 有一個方法如下: -

public void setCurrencyCode(List<String> newCurrencycode){
    this.currencycode = newCurrencycode;
}

我正在使用 Java Reelections 來調用此方法,如下所示:-

try {
    List<String> value = new ArrayList<String>();
    value.add("GB");

    Class<?> clazz = Class.forName( "com.xxx.Currency" );
    Object obj = clazz.newInstance();
    Class param[] = { List.class };
    Method method = obj.getClass().getDeclaredMethod( "setCurrencyCode", param );
    method.invoke( value );
} catch(Exception e) {
    System.out.println( "Exception : " + e.getMessage() );
}

但是,“調用”調用會引發異常:- java.lang.IllegalArgumentException: object 不是聲明 class 的實例

有任何想法嗎?

謝謝

莎拉

您沒有正確調用invoke()invoke()期望目標 object 作為第一個參數,然后方法調用的參數作為以下參數(從 java 1.5 開始,它是一個可變參數)

嘗試這個:

try 
    {
        List<String> value = new ArrayList<String>();
        value.add("GB");

        Class<?> clazz = Class.forName( "com.xxx.Currency" );
        Object obj = clazz.newInstance();
        // Since java 1.5, you don't need Class[] for params: it's a varargs now 
        Method method = clazz.getDeclaredMethod( "setCurrencyCode", List.class ); // you already have a reference to the class - no need for obj.getClass()
        method.invoke( obj, value ); // invoke expects the target object, then the parameters
    }
    catch(Exception e)
    {
        System.out.println( "Exception : " + e.getMessage() );
    }
}

這意味着您傳遞給invokevalue object 不是定義該method的 class 的實例。 這是因為invoke的第一個參數是要調用的object,后面的arguments是被調用方法的參數。 (在這種情況下,它看起來 value 需要是com.xxx.Currency的實例 - 當然不是,因為它是List 。)

由於您正在調用非靜態方法(並且會遇到創建新實例的麻煩),因此對於obj.setCurrencyCode(value)的反射等價物,在您的 try 塊結束時,您需要調用

method.invoke(obj, value)

而不是您當前的單個單參數調用。

暫無
暫無

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

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