动态参数反射调用方法

安德里亚·格里曼迪(Andrea Grimandi):

我使用这种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

安德里亚·格里曼迪(Andrea Grimandi):

实际上,正如@Boris所说,要完成工作,我要做的就是将每个参数转换为正确的类型。这样,Java设法Something使用正确的参数类型来调用类的正确方法

我的项目是一个Vert.x使用应用程序Vavrjodd但是最后一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章