使用Java反射调用invoke方法时出现IllegalArgumentException



我有一个类,它有一个方法如下:-

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

我使用Java的反射调用这个方法如下:-

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() );
}

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

任何想法?

感谢莎拉

您没有正确调用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() );
    }
}

这意味着您传递给invokevalue对象不是定义method的类的实例。这是因为invoke的第一个参数是要对其进行调用的对象,随后的参数是被调用方法的参数。(在这种情况下,看起来value需要是com.xxx.Currency的实例-当然它不是,因为它是List。)

由于您正在调用非静态方法(并且要创建新实例的麻烦),那么对于obj.setCurrencyCode(value)的反射等效,在您的try块的末尾,您需要调用

method.invoke(obj, value)

相关内容

  • 没有找到相关文章

最新更新