如何使用反射在java中调用带有变量参数的方法?

时间:2012-01-12 23:37:47

标签: java reflection

我正在尝试使用java反射调用带有变量参数的方法。这是承载方法的类:

public class TestClass {

public void setParam(N ... n){
    System.out.println("Calling set param...");
}

这是调用代码:

try {
        Class<?> c = Class.forName("com.test.reflection.TestClass");
        Method  method = c.getMethod ("setParam", com.test.reflection.N[].class);
        method.invoke(c, new com.test.reflection.N[]{});

我在调用invoke的最后一行以“错误的参数个数”的形式收到IllegalArgumentException。不知道我做错了什么。

任何指针都将受到赞赏。

  • 感谢

2 个答案:

答案 0 :(得分:13)

public class Test {

public void setParam(N... n) {
    System.out.println("Calling set param...");
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws Exception {
    Test t=new Test();
    Class<?> c = Class.forName("test.Test");
    Method  method = c.getMethod ("setParam", N[].class);
    method.invoke(t, (Object) new N[]{});
}
}

适合我。

  1. 将你的N []投射到对象
  2. 在实例上调用invoke,而不是在类
  3. 上调用

答案 1 :(得分:3)

您的代码段中没有调用methd的TestClass实例。您需要TestClass实例,而不仅仅是TestClass本身。在newInstance()上致电c,并将此调用的结果用作method.invoke()的第一个参数。

此外,为确保您的数组被视为一个参数,而不是varargs,您需要将其强制转换为Object:

m.invoke(testClassInstance, (Object) new com.test.reflection.N[]{});