java调用方法dnamicall具有动态数量的参数

时间:2016-04-05 15:04:00

标签: java

我在看这个问题

How do I invoke a Java method when given the method name as a string?

并应用第一个答案所说的

这是我用dyanmically调用方法的代码,它的参数是一个字符串数组

java.lang.reflect.Method method;
                    try {
                        String [] requiredParameters = testService.getRequiredParameters();
                        String [] parameters = new String[requiredParameters.length];
                        for (int i = 0; i<requiredParameters.length ; i++){
                            String valueRequiredParameter = request.getParameter(requiredParameters[i]);
                            parameters[i] = valueRequiredParameter;
                        }
                          method = new TestRecommendations().getClass().getMethod(service, parameters);
                        } catch (SecurityException e) {
                          // exception handling omitted for brevity
                        } catch (NoSuchMethodException e) {
                          // exception handling omitted for brevity
                        }

我在getMethod状态下遇到编译器错误:

The method getMethod(String, Class<?>...) in the type Class<capture#1-of ? extends TestRecommendations> is not applicable for the arguments (String, String[])

这是我想要动态调用的方法

public ResultSet level0ForUser(String ... userURI) {

2 个答案:

答案 0 :(得分:2)

你传递的参数类型错误。您的getMethod来电接受一个String个实例和多个Class个实例。而且您尝试传递一个StringString数组

通过documentation

  

getMethod(String name, Class<?>... parameterTypes)

     

返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定公共成员方法。 name参数是一个String,指定所需方法的简单名称。 parameterTypes参数是一个Class对象的数组,它以声明的顺序标识方法的形式参数类型。如果parameterTypes为null,则将其视为空数组。

所以你需要传递Class var arg,它包含所需方法的所有参数类型。对于你的方法,你应该写一些类似的东西:

Method m = TestRecommendations.class.getMethod("service", String[].class);

答案 1 :(得分:2)

使用类似的方法获取方法:

Method m = TestRecommendations.class.getMethod("level0ForUser", String[].class);

并调用:

m.invoke(new TestRecommendations(), new Object[] { new String[]{ "A", "B", "C" } } );