![](/img/trans.png)
[英]Method.invoke throws java.lang.IllegalArgumentException: wrong number of arguments
[英]Using method.invoke Exception in thread “main” java.lang.IllegalArgumentException: wrong number of arguments
我试图调用一个方法并返回值; 但是,我得到了一个IllegalArgumentException:错误的参数数量
这是示例代码:
public class MyObjAnnoParser {
public void parse(Class clazz, Object obj) throws ClassNotFoundException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, InstantiationException{
WatchLogAnno wlAnno= method.getAnnotation(WatchLogAnno.class);
Method[] methods = clazz.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(WatchLogAnno.class)) {
String info = wlAnno.parentClass();
Class cls = Class.forName(info);
//error occurs here -- not sure what it means by wrong number
//the obj is wrapped as an Object array as can be seen....
Object objVal= method.invoke(cls.newInstance(), new Object[]{obj});
System.out.println(objVal);
}
}
}
}
注释类:
@Target(ElementType.METHOD )
@Retention(RetentionPolicy.RUNTIME)
public @interface WatchLogAnno {
String parentClass() default "";
}
MyObj类别:
public class MyObj {
private String summary;
@WatchLogAnno(parentClass = "com.stuff.MyObj")
public String getSummary(){
return summary;
}
public void setSummary(String summary){
this.summary = summary;
}
}
测试调用解析器的类:
public class MyObjAnnoParserTest {
public static void main(String [] args) throws Exception {
MyObjAnnoParser parser = new MyObjAnnoParser ();
parser.parse(Annotated.class);
MyObj myObj = new MyObj();
myObj.setSummary("Testing an entry for this piece");
parser.parse(myObj.class, myObj );
}
}
因此,正如我在注释中上面列出的那样,当我进入invoke.method调用时,它将引发IllegalArgumentException...。
我确信这是一个简单的错误...感谢您的帮助...谢谢!
在行中
Object objVal= method.invoke(cls.newInstance(), new Object[]{obj});
您尝试使用签名调用方法
Object method(Object o)
但是你的clas有签名
String getSummary()
因此,反射找不到任何方法。
您也可以在类中创建一个新对象,而不使用提供的对象。
尝试使用以下方式调用反射
Object objVal = method.invoke(obj, new Object[]{});
没有任何参数。
package test;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class datadriven_jnuit {
private int var1;
private int var2;
public void datadriven_junit(int a, int b)
{
this.var1 = a;
this.var2 = b;
}
@Parameterized.Parameters
public static List<Object []> data()
{
return Arrays.asList (new Object[][] { {543,11},{65,47}} );
}
@Test
public void testcase()
{
System.out.println( var1);
System.out.println(var2);
}
}
方法
@WatchLogAnno(parentClass = "com.stuff.MyObj")
public String getSummary(){
return summary;
}
不带任何参数(除隐this
对象)。 但是,调用该方法时,您将传递一个:
method.invoke(cls.newInstance(), new Object[]{obj});
要么做
method.invoke(cls.newInstance(), new Object[0]);
或定义被叫方以采用参数:
@WatchLogAnno(parentClass = "com.stuff.MyObj")
public String getSummary(Object mustBeDeclaredEvenIfNotUsed){
return summary;
}
第三种可能性是, 使用反射检查要调用的方法预期有多少参数,并相应地调整参数:
// UNTESTED!
final Class<?>[] expectedParams = method.getParameterTypes();
Object[] actualValues;
if (expectedParams.length == 0) actualValues = new Object[0];
else if (expectedParams.length == 1) actualValues = new Object[] { obj };
else
throw new UnsupportedOperationException("callee has wrong method signature");
如果走这条路线,那么检查声明的参数类型是否与实际值兼容可能也是一个好主意:
if (!expectedParams[0].isAssignableFrom(obj))
throw new UnsupportedOperationException("callee's declared parameter type does not match the argument value");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.