Java 使用反射/将列表转换为Var Args调用方法

Java 使用反射/将列表转换为Var Args调用方法,java,list,reflection,invoke,variadic-functions,Java,List,Reflection,Invoke,Variadic Functions,我有一个参数列表和方法名。我想使用反射调用该方法。 当我检查java文档中的Method.invoke及其类似的Method.invoke(对象o,对象args…)时。 我知道要为第一个参数传递什么(即,如果实例方法是在哪个方法上调用的实例),args是该方法的参数 但现在我有了一个列表,其中包含要传递给该方法的值 比如说:我想调用方法ClassName.methodName(String,int,int),我有一个包含{val1,3,4}的列表 使用反射可能类似于Method.invoke(c

我有一个参数列表和方法名。我想使用反射调用该方法。 当我检查java文档中的Method.invoke及其类似的Method.invoke(对象o,对象args…)时。 我知道要为第一个参数传递什么(即,如果实例方法是在哪个方法上调用的实例),args是该方法的参数

但现在我有了一个列表,其中包含要传递给该方法的值

比如说:我想调用方法ClassName.methodName(String,int,int),我有一个包含{val1,3,4}的列表

使用反射可能类似于Method.invoke(classNameInstance,?)。但我不知道如何将参数列表转换为varargs并传递

一种方法是,如果我知道列表大小是3,那么我可以编写Method.invoke(classNameInstance,list.get(0),list.get(1),list.get(2))

但是我想动态调用的一些方法需要0到12个参数。因此,创建switch case并编写12个case看起来并不“好”。每个都将检查参数的数量,并使用参数构建单独的调用

除了使用开关盒,还有什么办法可以做到这一点吗


任何帮助都将不胜感激。

符号对象。。。只表示对象[]。它只是数组旋转的语法糖。传递一个数组,它就会工作。

Varargs实际上只是一个数组

可以像这样检索该方法,假设它需要
int..
args:

Method method = MyClass.class.getMethod("someMethod", int[].class);
method.invoke(myInstance, argumentsList.toArray());

已编辑:这是一种更通用的方法,适用于任何类型的vararg参数:

        Class<?> c = int.class;
        Object array = Array.newInstance(c, list.size());
        for (int i = 0; i < list.size(); i++)
                Array.set(array, i, list.get(i));
        Test.class.getDeclaredMethod("test", array.getClass()).invoke(
                new Test(), new Object[] { array });

非常感谢方法.invoke(classNameInstance,argumentsList.toArray());将工作…事实上,我尝试了这个,如果一个简单类型的列表,这个工作很好。但是当API是(String,int,int)并且列表为:{“val1”,“2”,“3”}时,可以这样说。在将它们转换为数组后,其作为类型的给定问题不匹配。这意味着,在将它们直接传递到调用方法之前,我需要将它们类型转换为与该方法匹配的特定类型。如果是这样,我不能直接转换为数组并使用。如果我弄错了,请纠正我。List.toArray()将返回Object[]--不适用于“int…”。谢谢,但这将适用于int,但类型列表转换问题列表将出现,并将生成类型不匹配。添加了示例w/任何类型的vararg--Class c=int.Class或任何您想要的类型。
import java.util.*;
import java.lang.reflect.*;

class Test
{
        public static void main(String[] args) throws Exception
        {
                List<Integer> list = new ArrayList<Integer>();
                list.add(1); list.add(2); list.add(3);
                Test.class.getDeclaredMethod("test", Integer[].class).invoke(
                    new Test(), new Object[] { list.toArray(new Integer[0]) });
                int[] params = new int[list.size()];
                for (int i = 0; i < params.length; i++) params[i] = list.get(i);
                Test.class.getDeclaredMethod("test", int[].class).invoke(
                    new Test(), new Object[] { params });
        }

        public void test(int ... i) { System.out.println("int[]: " + i[0] + ", " + i[1] + ", " + i[2]); }
        public void test(Integer... i) { System.out.println("Integer[]" + Arrays.asList(i)); }
}