使用反射调用方法/将List转换为Var-Args



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

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

举个例子:我想调用方法ClassName.methodName(String,int,int),我有一个包含{val1,3,4}的List。

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

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

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

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

任何帮助都将不胜感激。

符号对象。。。只表示对象[]。这只是一个排列的句法糖。传递一个数组,它就会工作。

编辑:这是一种更通用的方法,适用于任何类型的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 });

CCD_ 1具有与CCD_ 2相同的签名。不能在同一个类中声明两者。

以下是如何使用反射(基元和非基元)调用它们:

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)); }
}
Varargs实际上只是一个数组。

该方法可以这样检索,假设它使用int... args:

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

相关内容

  • 没有找到相关文章

最新更新