Java 改变参数数量的函数调用
Java function call with changing parameter amount
我有一个问题。
当我的程序是 运行 时,我收到一个带有参数的请求(我事先不知道确切的数量)、一个函数名称和一个 class 名称。我在运行时加载 class 并想调用请求中给出的方法。我现在的问题是:
如何调用参数量不断变化的函数?
myClass.getMethod(this.metaData.getFunctionName(), java.lang.Integer);
这是一次正常的通话。
但我想要这样的东西
myClass.getMethod(this.metaData.getFunctionName(), ..args);
或者像这样
myClass.getMethod(this.metaData.getFunctionName(), for(param p: in request = new param));
我知道这是不可能的,但是否可以通过其他方式实现?还是我必须提前知道确切的金额?
编辑解决方案:
@LppEdd 发布了解决方案,@DawoodibnKareem 也在评论中说了。如果你有一个用 (...args) 定义的函数,你可以传递一个数组,数组的每个元素都算作传递的参数。
我知道这是非常不安全的,但该项目以某种方式提供了安全性。
rgds,
丹尼斯
你可能想要像
这样的东西
private Class<?>[] buildParameterTypes(final List<String> types) {
return types.stream()
.map(typeStr -> {
try {
return Class.forName(typeStr);
} catch (final ClassNotFoundException e) {
throw new IllegalArgumentException(e);
}
}).toArray(Class[]::new);
}
用法
myClass.getMethod(this.metaData.getFunctionName(), buildParameterTypes(strTypeList));
请求必须将参数类型作为 String
数组发送。
[
"java.lang.String",
"java.lang.Integer",
...
]
但是,是的,不要这样做。
顺便说一句,你是在谈论网络请求吗?哪种要求?
我有一个问题。 当我的程序是 运行 时,我收到一个带有参数的请求(我事先不知道确切的数量)、一个函数名称和一个 class 名称。我在运行时加载 class 并想调用请求中给出的方法。我现在的问题是: 如何调用参数量不断变化的函数?
myClass.getMethod(this.metaData.getFunctionName(), java.lang.Integer);
这是一次正常的通话。 但我想要这样的东西
myClass.getMethod(this.metaData.getFunctionName(), ..args);
或者像这样
myClass.getMethod(this.metaData.getFunctionName(), for(param p: in request = new param));
我知道这是不可能的,但是否可以通过其他方式实现?还是我必须提前知道确切的金额?
编辑解决方案: @LppEdd 发布了解决方案,@DawoodibnKareem 也在评论中说了。如果你有一个用 (...args) 定义的函数,你可以传递一个数组,数组的每个元素都算作传递的参数。
我知道这是非常不安全的,但该项目以某种方式提供了安全性。
rgds, 丹尼斯
你可能想要像
这样的东西private Class<?>[] buildParameterTypes(final List<String> types) {
return types.stream()
.map(typeStr -> {
try {
return Class.forName(typeStr);
} catch (final ClassNotFoundException e) {
throw new IllegalArgumentException(e);
}
}).toArray(Class[]::new);
}
用法
myClass.getMethod(this.metaData.getFunctionName(), buildParameterTypes(strTypeList));
请求必须将参数类型作为 String
数组发送。
[
"java.lang.String",
"java.lang.Integer",
...
]
但是,是的,不要这样做。
顺便说一句,你是在谈论网络请求吗?哪种要求?