我被这个问题困惑了两天。我在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列表。
答案 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中没有办法创建'参数列表'。