Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在线程中使用method.invoke异常;“主要”;java.lang.IllegalArgumentException:参数数目错误_Java - Fatal编程技术网

在线程中使用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,因为它在实例化的类中没有实际访问权限。。。