Java解包参数列表
这是另一个问题“我如何用Java做这个?” 在Python中,我可以使用’*’符号来解压缩参数,如下所示:
>>> range(3, 6) # normal call with separate arguments [3, 4, 5] >>> args = [3, 6] >>> range(*args) # call with arguments unpacked from a list [3, 4, 5]
Java支持使用...args
语法获取args列表,但有没有办法(可能使用Reflection库?)解压缩其他函数的那些?
public void printStrings(String... strings) { // the strings parameter is really a String[]. // You could do anything to it that you normally // do with an array. for(String s : strings){ System.out.println(s); } }
可以像这样调用:
String[] stringArray = new String[10]; for(int i=0; i < stringArray.length; i++){ stringArray[i] = "String number " + (i+1); } printStrings(stringArray);
...
语法实际上是数组的语法糖。
Java没有您描述的function,但您可以通过多种方式伪装它。
我认为最接近的近似意味着使用varargs重载您想要以这种方式使用的任何函数。
如果你有一些方法:
public void foo(int a, String b, Widget c) { ... }
你可以超载它:
public void foo(Object... args) { foo((Integer)args[0], (String)args[1], (Widget)args[2]); }
但这非常笨拙,容易出错,难以维护。
更一般地说,你可以使用reflection来使用任何参数调用任何方法,但它也有很多陷阱。 这是一个错误的,不完整的例子,说明它如何变得如此丑陋:
public void call(Object targetInstance, String methodName, Object... args) { Class>[] pTypes = new Class>[args.length]; for(int i=0; i < args.length; i++) { pTypes[i] = args[i].getClass(); } Method targetMethod = targetInstance.getClass() .getMethod(methodName, pTypes); targetMethod.invoke(targetInstance, args); }
如果您调用的函数不是varargs函数(用…声明),那么您需要使用reflection。 Method.invoke()
接受参数的数组Object[]
。
通过reflection的困难部分是找到正确的方法(嗯,如果只有一种方法具有相同的名称,那就很容易了,否则很难)。
成本是查找/调用方法的额外时间。
当然,如果你在编译时知道具体的方法,那么你可以手动处理这个,例如这里的3参数函数:
Object[] args = /* get args from somewhere */ callSomeNonVarargsFunction((Cast1)args[0], (Cast1)args[1], (Cast1)args[2]);
- AsynchronousDispatcher错误
- SVG到Java Graphics2D
- 在Java中validationxpath表达式
- 尝试通过Inline :: Java模块将Java内联到Perl中
- 访问被拒绝(“java.io.FilePermission”“执行”)
- 使用springfox和Swagger2时,为什么v2 / api-docs是默认URL?
- 如何阻止Maven的validation阶段重建工件?
- 将图例添加到jFreechart
- MongoDB Java API:com.mongodb.DBCollection.Save()和com.mongodb.DBCollection.Insert()之间的区别?