如何将数组转换为参数列表以供 Java 中的方法调用

How to transform an array to a list of args for method invocation in Java

被这个问题困扰了两天。我在 Class 测试中有一个 testN 方法列表,我将为此 class 添加更多测试*方法。示例代码如下

public class Test {

    public void test1(String a, int b, boolean c){
        System.out.println("a="+a+"  "+b+ " c="+c);
    }

    public void test3(Test test){
        System.out.println(test.toString());
    }


    public void run(Object... objs){
        //First way...
        if(objs.length>=3){
            test1((String)objs[0], (int)objs[1], (boolean)objs[2]);
        }else if(objs.length <3 ){
            test3((Test)objs[0]);
        }
        //Second way? 
        MethodType type1 = MethodType.methodType(void.class, String.class, int.class, boolean.class);
        if(objs.length>=3){


//How to tranform first 3 elements of objs to a list (String, int, boolean) 
            Object[] t = Arrays.copyOfRange(objs, 0, type1.parameterCount());
            test1(???);

        }

        MethodType type3 = MethodType.methodType(void.class, Test.class);
        if(objs.length < 3 ){


        }       

    }
    public  static void main(String[] args){
        Test test = new Test();
        test.run("String", 3, false, 5,7);
        test.run(test,1);
    }
}

方法 run(Object... objs) 是这个 class 的主要入口,它接受一个 var args 列表。在方法run内部,它根据objs的长度调用不同的test*方法(objs被识别为数组)。

我的问题是如何以第二种方式将 Object[] t 作为方法 test1 的 var args 列表传递?第一种方式是handle-write,当添加更多test*个方法时不实用。 Object[] t 是数组,它是一个对象,而 test1 需要三个参数。我正在寻找一种可以将数组转换为用于方法调用的参数列表的方法。

你需要使用反射。首先,获取您的 Test.class — 这很简单,只是 Test.class。接下来,获取您的方法,这可以通过了解参数的类型(通过每个参数的 .getClass()Class.getMethod(…) 方法或通过搜索 Class 返回的数组来完成=14=]。两者都会给你一个 Method 对象来处理。最后,你可以用 method.invoke(this, objs);.

调用方法

编辑:关于您的评论,没有 List 个参数。至少不像 java.util.List 那样。 JVM 确实将参数放在堆栈上(并且可以以任何可以想到的方式自由地这样做;在许多情况下甚至堆栈都会被优化到寄存器中)。

所以问题是,您需要 a) 知道对象的 VM 类型(可以是 int、long、float、double 或 ref 中的任何一种)和 b) 对象的位置。然后您可以通过创建一个合成字节码序列来做类似的事情(请注意,虽然这会产生有效的 JVM 字节码,但没有有效的 Java 代码可以执行此操作,除非您计算自定义 class 加载程序)。否则,不,Java 中没有办法创建一个 'argument list'.