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

3

这个问题困扰了我两天。我有一个名为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);
    }
}

方法 run(Object... objs) 是该类的主要入口,它接受可变参数列表。在方法 run 中,根据 objs 的长度(objs 被识别为数组),它会调用不同的 test* 方法。
对于我来说,问题在于如何将第二种方式中的 Object[] t 作为 test1 方法的可变参数列表进行传递?第一种方式是处理-写入方式,当添加更多的 test* 方法时并不实用。 Object[] t 是一个数组,它只是一个对象,而 test1 需要三个参数。我正在寻找一种可以将数组转换为方法调用参数列表的方法。

我之前尝试过这个,但编译失败了。因为asList返回的是List<Object>,而不匹配“test1”的参数。这与我直接传递“Object[] t”相同。 - shijie xu
1个回答

0
你需要使用反射。首先,获取你的 Test.class — 这很容易,只需使用 Test.class。接下来,获取你的方法,可以通过知道参数类型(通过每个参数的 .getClass()Class.getMethod(…) 方法)或通过搜索 getMethods() 返回的数组来完成。两者都会给你一个 Method 对象来使用。最后,你可以使用 method.invoke(this, objs); 调用该方法。
编辑:关于你的评论,没有参数的 List。至少不是像 java.util.List 那样。JVM 确实将参数放在堆栈上(并且可以以任何可想象的方式自由地这样做;甚至堆栈在许多情况下也会被优化为寄存器)。
所以问题在于,您需要 a)知道对象的VM类型(可以是int,long,float,double或ref之一)和b)对象的位置。然后,您可以通过创建合成的字节码序列来执行类似的操作(请注意,虽然这将产生有效的JVM字节码,但除非您计算自定义类加载器,否则没有有效的Java代码)。否则,在Java中没有办法创建“参数列表”。

这是另一种方式,类似于Java中的新MethodHandle,使用Object[]进行调用。它避免了我遇到的问题。然而,我仍在等待是否有一些简单的方法将object[]转换为参数列表。 - shijie xu
感谢您的评论。现在我正在尝试使用load,store字节码指令生成新的字节码,将Object[]的元素放置在JVM堆栈上。希望这能够起作用。 - shijie xu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接