如何将数组转换为参数列表,以便在Java中调用方法

如何将数组转换为参数列表,以便在Java中调用方法,java,arraylist,variadic-functions,Java,Arraylist,Variadic Functions,这个问题困扰了我两天。我在类Test中有一个testN方法列表,我将为这个类添加更多的Test*方法。示例代码如下所示 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.printl

这个问题困扰了我两天。我在类Test中有一个testN方法列表,我将为这个类添加更多的Test*方法。示例代码如下所示

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);
    }
}
公共类测试{
公共void test1(字符串a、整数b、布尔值c){
System.out.println(“a=“+a+”“+b+”c=“+c”);
}
公共无效测试3(测试){
System.out.println(test.toString());
}
公共无效运行(对象…objs){
//第一条路。。。
如果(对象长度>=3){
test1((字符串)objs[0],(int)objs[1],(布尔值)objs[2]);
}否则如果(objs.length=3){
//如何将objs的前3个元素转换为列表(String、int、boolean)
Object[]t=Arrays.copyOfRange(objs,0,type1.parameterCount());
试验1(??);
}
MethodType类型3=MethodType.MethodType(void.class,Test.class);
如果(对象长度<3){
}       
}
公共静态void main(字符串[]args){
测试=新测试();
测试运行(“字符串”,3,假,5,7);
测试。运行(测试,1);
}
}
方法
run(Object…objs)
是这个类的主要条目,它接受一个var参数列表。在方法
run
内部,它根据objs的长度调用不同的test*方法(objs被识别为数组)


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

您需要使用反射。首先,获取您的Test.class-这很简单,只是
Test.class
。接下来,获取您的方法,这可以通过从您的参数中了解类型(通过每个参数的
.getClass()
类的
.getMethod(…)
方法来实现,或者通过搜索
getMethods()返回的数组来实现
。两者都将为您提供一个要使用的
方法
对象。最后,您可以使用
方法调用该方法。调用(this,objs);

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


所以问题是,您需要a)知道对象的VM类型(可以是int、long、float、double或ref中的任意一种)和b)对象的位置。然后,您可以通过创建一个合成字节码序列来执行类似的操作(请注意,虽然这将生成有效的JVM字节码,但除非您计算自定义类加载器,否则没有有效的Java代码可以这样做)。否则,在Java中无法创建“参数列表”。

我以前尝试过,但编译失败。因为asList返回的列表与
test1
的参数不匹配。这与我直接传递
Object[]t
相同。这是另一种使用Object[]调用的方式,类似于Java中的new MethodHandle。它避免了我遇到的问题。然而,我仍在等待是否有简单的方法将对象[]转换为参数列表..谢谢您的评论。现在我尝试使用*load、*store字节码指令生成新的字节码,将Object[]的元素放置在JVM堆栈中。希望这能奏效。