无法使用 NoSuchMethodException 调用带有 varargs 参数的方法



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

并捕获了CCD_ 1。我搞不清楚这里出了什么问题。

代码:

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);

它准确地抛出:

java.lang.NoSuchMethodException:反射测试.vargMethod(java.lang.String,int,int)

  • 如何解决这个问题

varargs的参数类型应为Integer[].class,因为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;
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);
    }
}

最新更新