我有一个类,其方法如下: -
public void setCurrencyCode(List<String> newCurrencycode){
this.currencycode = newCurrencycode;
}
我正在使用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() );
}
但是,“调用”调用会引发异常: - java.lang.IllegalArgumentException:object不是声明类
的实例有什么想法吗?
由于
萨拉
答案 0 :(得分:7)
你没有正确地调用invoke():invoke()
期望目标对象作为第一个参数,然后方法调用的参数作为以下参数(因为java 1.5,它是一个varargs参数)< / p>
试试这个:
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() );
}
}
答案 1 :(得分:6)
这意味着您传递到value
的{{1}}对象不是定义invoke
的类的实例。这是因为invoke的第一个参数是使调用的对象,后续参数是被调用方法的参数。 (在这种情况下,看起来值必须是method
的一个实例 - 当然它不是,因为它是com.xxx.Currency
。)
由于您正在调用非静态方法(并且会遇到创建新实例的麻烦),因此对于反射等效的List
,在try块的末尾,您需要调用
obj.setCurrencyCode(value)
而不是你当前的单一arg电话。