Java Can';t使用带有反射的varargs参数调用方法-NoSuchMethodException

Java Can';t使用带有反射的varargs参数调用方法-NoSuchMethodException,java,reflection,Java,Reflection,我正在尝试使用反射调用带有varargs参数的方法 并捕获了NoSuchMethodException。我不知道这里出了什么问题 代码: public class ReflectionTest { public ReflectionTest() { } private void varargMethod(String string, Integer ... var) { System.out.println("vargarMethod() called"

我正在尝试使用反射调用带有varargs参数的方法

并捕获了
NoSuchMethodException
。我不知道这里出了什么问题

代码:

public class ReflectionTest {

    public ReflectionTest() {   }

    private void varargMethod(String string, Integer ... var) {

        System.out.println("vargarMethod() called");
        System.out.println(string + " Number of args: " + var.length
                + "\nContents");

        for (int i = 0; i < var.length; i++) {
            System.out.printf(" args %d: %d", i, var[i]);
            //System.out.println(" args " + i + ": " + var[i]);
        }

        System.out.println();
    }

    public static void main(String[] args) throws Exception {

        Class[] parameterTypes = new Class[] { String.class, int.class, int.class, int.class };

        //System.out.println(Arrays.toString(parameterTypes));

        Method varMeth = test.getClass().getDeclaredMethod("varargMethod", parameterTypes);
        System.out.println("varMeth" + varMeth);

        Object[] arguments = new Object[] { new String("my perfect string"),
                new Integer(10), new Integer(100), new Integer(47) };

        varMeth.invoke(test, arguments);
公共类ReflectionTest{
公共ReflectionTest(){}
私有void varargMethod(字符串、整数…var){
System.out.println(“调用了vargarMethod());
System.out.println(字符串+“参数数:”+var.length
+“\n内容”);
对于(int i=0;i
它准确地抛出:

java.lang.NoSuchMethodException:ReflectionTest.varargMethod(java.lang.String,int,int)

  • 如何解决这个问题?

参数类型应为
整数[]。对于varargs as varargs表达式,类
指定该参数为变量数组参数。因此正确的方法是:

Class[] parameterTypes = new Class[] { String.class, Integer[].class };

//System.out.println(Arrays.toString(parameterTypes));
ReflectionTest test = new ReflectionTest();
Method varMeth = test.getClass().getDeclaredMethod("varargMethod", 
                                                      parameterTypes);
System.out.println("varMeth" + varMeth);

Object[] arguments = new Object[] { new String("my perfect string"),
                                    new Integer[]{10, 100, 47}
                                  };

varMeth.invoke(test, arguments);

如果编译.java文件,然后反编译.class 文件中,您将看到此方法声明:

private transient void varargMethod(String string, Integer var[])
这是你的代码

import java.lang.reflect.Method;

public class ReflectionTest {

    public ReflectionTest() {   }

    private void varargMethod(String string, Integer ... var) {

        System.out.println("vargarMethod() called");
        System.out.println(string + " Number of args: " + var.length
                + "\nContents");

        for (int i = 0; i < var.length; i++) {
            System.out.printf(" args %d: %d", i, var[i]);
            //System.out.println(" args " + i + ": " + var[i]);
        }

        System.out.println();
    }

    public static void main(String[] args) throws Exception {

        ReflectionTest test = new ReflectionTest(); 
        Class[] parameterTypes = new Class[] { String.class, Integer[].class };

        //System.out.println(Arrays.toString(parameterTypes));

        Method varMeth = test.getClass().getDeclaredMethod("varargMethod", parameterTypes);
        System.out.println("varMeth" + varMeth);

        Object[] arguments = new Object[] { new String("my perfect string"),
                new Integer[] { new Integer(10), new Integer(100), new Integer(47) } };

        varMeth.invoke(test, arguments);
    }
}
import java.lang.reflect.Method;
公共类反射测试{
公共ReflectionTest(){}
私有void varargMethod(字符串、整数…var){
System.out.println(“调用了vargarMethod());
System.out.println(字符串+“参数数:”+var.length
+“\n内容”);
对于(int i=0;i
这是固定的代码,改动最小。更改的内联注释:

import java.lang.reflect.Method;

public class ReflectionTest {

    public ReflectionTest() {}

    private void varargMethod(String string, Integer... var) {

        System.out.println("vargarMethod() called");
        System.out.println(string + " Number of args: " + var.length + "\nContents:");

        for (int i = 0; i < var.length; i++) {
            System.out.printf(" args %d: %d", i, var[i]);
        }

        System.out.println();
    }

    public static void main(String[] args) throws Exception {

        Class[] parameterTypes = new Class[] {
                                        String.class,
                                        Integer[].class // use array to represent varargs
                                      };

        //System.out.println(Arrays.toString(parameterTypes));
        ReflectionTest test = new ReflectionTest();
        Method varMeth = test.getClass().getDeclaredMethod("varargMethod", parameterTypes);
        System.out.println("varMeth" + varMeth);

        Object[] arguments = new Object[]{
                                    "my perfect string",
                                    new Integer[]{10, 100, 47} // again use array for varargs
                                  };

        varMeth.invoke(test, arguments);
    }

}
import java.lang.reflect.Method;
公共类反射测试{
公共ReflectionTest(){}
私有void varargMethod(字符串、整数…var){
System.out.println(“调用了vargarMethod());
System.out.println(字符串+“参数数:”+var.length+“\n内容:”);
对于(int i=0;i
尝试传递整数数组。Varargs在内部被视为数组。