5

invoke在java中使用该方法时遇到问题。

我有一种方法可以用来为我提供一个Method对象,它看起来像:

 public static Method provideMethod(String methodName, Class targetClass) throws NoSuchMethodException {
    Method method = targetClass.getDeclaredMethod(methodName,null);

    //Set accessible provide a way to access private methods too
    method.setAccessible(true);

    return method;
}

好的,当我尝试从任何没有参数的上下文(静态或非静态)访问方法时,此方法非常有效。

现在的问题是我不能调用调用并将参数传递给具有参数的方法,例如:

我有以下方法:

private static boolean createDirectory(String path, String fileName) {
  ... 
}

我想像这样调用它:

 Boolean created = (Boolean) DataUtils.provideMethod("createDirectory", FileUtils.class).
            invoke(null, String.class, String.class);

但我得到了java.lang.NoSuchMethodException: createDirectory []

有人知道我如何调用具有参数的私有静态方法吗?

而且,如何将值传递给该方法的参数?

谢谢,阿克德

4

3 回答 3

6

您正在显式调用反射方法,该方法查找使用给定参数类型声明的方法 - 但您没有提供任何参数类型。

如果您想查找具有给定名称的任何方法,请使用getDeclaredMethods()并按名称过滤...但是当您调用时invoke,您需要提供字符串,而不是参数类型。

或者,将您的provideMethod调用更改为接受参数类型,以便您可以使用:

DataUtils.provideMethod("createDirectory", FileUtils.class,
                        String.class, String.class)
         .invoke(null, "foo", "bar")
于 2012-11-13T12:28:00.167 回答
2

当您调用时,您只是专门查找没有参数的方法

Method method = targetClass.getDeclaredMethod(methodName,null)

为了找到 createDirectory 方法,您需要调用

targetClass.getDeclaredMethod("createDirectory", String.class, String.class)

但目前你的provideMethod方法没有办法做到这一点。

我建议您更改的签名,provideMethod以便它允许调用者传入他们正在寻找的参数的类,如下所示:

public static Method provideMethod(String methodName, Class targetClass, Class... parameterTypes) throws NoSuchMethodException {
    Method method = targetClass.getDeclaredMethod(methodName, parameterTypes);

    //Set accessible provide a way to access private methods too
    method.setAccessible(true);

    return method;
}
于 2012-11-13T12:28:49.240 回答
2

改变这个

Method method = targetClass.getDeclaredMethod(methodName, null);

类似的事情

Method method = targetClass.getDeclaredMethod(methodName, Class<?>... parameterTypes);

和你的provideMethod相应。

于 2012-11-13T12:29:26.527 回答