首页 文章

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

提问于
浏览
3

我有一个参数列表,我有方法名称 . 我想使用反射调用方法 . 当我检查Method.invoke的java文档时,它像Method.invoke(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.get(1),list.get(2)) .

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

除了使用开关盒外,还有什么方法可以解决这个问题?

任何帮助将不胜感激 .

3 回答

  • -1

    符号对象...仅仅意味着对象[] . 它只是Arraynotation的语法糖 . 传递一个数组,它会工作 .

  • 0

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

    void m(X...p)void m(X[] p) 具有相同的签名 . 您不能在同一个类中声明它们 .

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

    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)); }
    }
    
  • 8

    Varargs真的只是一个阵列 .

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

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

相关问题