在线程中使用method.invoke异常;“主要”;java.lang.IllegalArgumentException:参数数目错误
我试图调用一个方法并返回值;但是,我得到了一个非法的参数例外:参数的数目错误 以下是示例代码:在线程中使用method.invoke异常;“主要”;java.lang.IllegalArgumentException:参数数目错误,java,Java,我试图调用一个方法并返回值;但是,我得到了一个非法的参数例外:参数的数目错误 以下是示例代码: public class MyObjAnnoParser { public void parse(Class clazz, Object obj) throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
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)
String getSummary()
但是你的班级有签名
Object method(Object o)
String getSummary()
因此,反射找不到任何方法
此外,还可以为类创建一个新对象,而不是使用提供的对象
尝试调用反射
Object objVal = method.invoke(obj, new Object[]{});
没有任何参数。方法
@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");
封装测试;
导入java.util.array;
导入java.util.List;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.junit.runners.Parameterized;
@RunWith(参数化的.class)
公共类数据驱动电路{
私有int var1;
私有int var2;
public void数据驱动的junit(inta,intb)
{
这1.var1=a;
这个.var2=b;
}
@参数化。参数化
公共静态列表数据()
{
返回Arrays.asList(新对象[][{{543,11},{65,47});
}
@试验
公共无效测试用例()
{
System.out.println(var1);
System.out.println(var2);
}
}
hmmm。。。所以MyObj类包含一组summary值。我现在理解了我是如何滥用invoke方法的,但仍然不确定如何访问getSummary()方法。我的意思是实例化的类MyObj MyObj和getSummary()方法在summary中设置的值…不确定是否有意义…谢谢…dirk。。。我在方法上有反向调用。。。要从getSummary()获取值,我必须执行method.invoke(obj,newobject[]{});。。。。再次感谢你们俩。。。它有助于向其他人反映这些问题……对……因此,如果我使用method.invoke(cls.newInstance(),new Object[]{})而不是method.invoke(cls.newInstance(),new Object[]{myObj}),getSummary()返回的值为null,因为它在实例化的类中没有实际访问权限。。。