Java Can';t使用带有反射的varargs参数调用方法-NoSuchMethodException
我正在尝试使用反射调用带有varargs参数的方法 并捕获了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"
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在内部被视为数组。