我使用这种method.invoke(instance, args...)
方式调用Class实例的某些方法,但是对于Java文档中正确指出的instance
,内部的每个方法invoke
都必须手动指定每个参数。
考虑Spring ...如何在HTTP调用期间在幕后的控制器方法中赋予参数价值?(但可以肯定的是,我的想法完全不同...)
我想知道Java中是否有任何方法可以动态地传递反射参数(甚至没有反射参数)而无需单独指定每个参数。
编辑
实例类的声明类似于:
public class Something {
public void doSth(String par1, String par2, Integer par3) {
//....
}
public void doSthElse(String par1, Boolean par2) {
//....
}
public void doSthElseMore(Integer par1) {
//....
}
}
我如何调用每种方法:
...
for (Method method : instance.getDeclaredMethods()) {
Object[] array = //BL: build array of values to pass to the invoke method.
//1. doSth may be new Object[] {"abc", "def", 123}
//2. doSthElse iteration may be new Object[] {"abc", false}
//3. doSthElseMore iteration may be new Object[] {123}
return method.invoke(instance, array);
}
...
如上所述,Something
类(instance
)中的每个方法都有不同数量的参数。
在每次迭代中,array
都有不同数量的值传递给invoke
。
实际上,正如@Boris所说,要完成工作,我要做的就是将每个参数转换为正确的类型。这样,Java设法Something
使用正确的参数类型来调用类的正确方法。
我的项目是一个Vert.x
使用的应用程序Vavr
,jodd
但是最后一个return语句显示了我如何解决。
public Object invokeMethod(Object service, Method method, RoutingContext routingContext) throws Exception {
MultiMap queryParams = routingContext.queryParams();
Map<String, String> pathParams = routingContext.pathParams();
Buffer body = routingContext.getBody();
// 1. type, 2. name, 3. value
List<Tuple3<Class<?>, String, Object>> list = List.empty();
for (Parameter par : method.getParameters()) {
ParamQuery paramQuery = par.getAnnotation(ParamQuery.class);
if (paramQuery != null) {
list = list.push(new Tuple3<Class<?>, String, Object>(par.getType(), paramQuery.value(),
queryParams.get(paramQuery.value())));
}
}
// TypeConverterManager used to "covnert" each object (String) from the HTTP call to the correct data type
return method.invoke(service, list.reverse()
.map(mapper -> TypeConverterManager.lookup(mapper._1()).convert(mapper._3())).toJavaArray());
}
但是,可以在GitHub上找到该项目
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句