如何在Java中将数组转换为args列表以进行方法调用

时间:2015-02-12 12:41:17

标签: java arraylist variadic-functions

我被这个问题困惑了两天。我在Class 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)是此类的主要条目,它接受var args列表。在方法run内部,它根据objs调用不同的test *方法。 length(objs被识别为数组)。

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

1 个答案:

答案 0 :(得分:0)

你需要使用反射。首先,获取Test.class - 这很简单,只是Test.class。接下来,获取您的方法,这可以通过了解参数中的类型(通过.getClass()对每个参数和.getMethod(…) Class方法或通过搜索{返回的数组}来完成。 {1}}。两者都会为您提供一个getMethods()对象。最后,您可以使用Method调用该方法。

编辑:关于您的评论,参数中没有列表。至少不像method.invoke(this, objs);那样。 JVM确实将参数放在堆栈上(并且可以以任何可能的方式自由地执行此操作;甚至堆栈在许多情况下也会被优化到寄存器中)。

所以问题是,你需要a)知道对象的VM类型(可以是int,long,float,double或ref中的任何一个)和b)对象的位置。然后你可以通过创建一个合成的字节码序列来做类似的事情(注意,虽然这会产生有效的JVM字节码,但除非你计算自定义类加载器,否则没有有效的Java代码可以做到这一点)。否则,不,Java中没有办法创建'参数列表'。