使用Java Reflection调用invoke方法时出现IllegalArgumentException

Sar*_*rth 4 java reflection invoke

我有一个类有以下方法: -

public void setCurrencyCode(List<String> newCurrencycode){
    this.currencycode = newCurrencycode;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Java Relections来调用此方法,如下所示: -

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() );
}
Run Code Online (Sandbox Code Playgroud)

但是,在"invoke"调用上引发异常: - java.lang.IllegalArgumentException:object不是声明类的实例

有任何想法吗?

谢谢

莎拉

Boh*_*ian 7

你没有正确调用invoke():invoke()期望目标对象作为第一个参数,然后将方法调用的参数作为以下参数(因为java 1.5,它是一个varargs参数)

试试这个:

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() );
    }
}
Run Code Online (Sandbox Code Playgroud)


And*_*yle 6

这意味着value您传入的对象invoke不是method定义它的类的实例.这是因为调用的第一个参数是要在其上的对象作出的呼叫,和随后的参数是参数被调用的方法.(在这种情况下,它看起来像值必须是一个实例com.xxx.Currency- 当然它不是,因为它是一个List.)

既然你正在调用一个非静态的方法(并且会遇到创建新实例的麻烦),那么对于反射的等价物obj.setCurrencyCode(value),在try块的末尾你需要调用

method.invoke(obj, value)
Run Code Online (Sandbox Code Playgroud)

而不是你当前的单一arg电话.