我在java中使用invoke
方法时遇到问题。
我有一个方法可以用来为我提供一个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;
}
好的,当我尝试从没有参数的任何上下文(静态或非静态)访问方法时,此方法非常有效。
现在的问题是我无法调用invoke并将参数传递给具有参数的方法,例如:
我有以下方法:
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 []
。
有人知道如何调用具有参数的私有静态方法吗?
并且,如何将值传递给该方法参数?
谢谢, Arkde
答案 0 :(得分:6)
您显式调用了一个反射方法,该方法查找使用给定参数类型声明的方法 - 但您没有提供任何参数类型。
如果您要查找具有给定名称的任何方法,请使用getDeclaredMethods()
并按名称过滤...但是当您致电invoke
时,您需要提供字符串值,而不是参数类型。
或者,将您的provideMethod
电话改为也接受参数类型,以便您可以使用:
DataUtils.provideMethod("createDirectory", FileUtils.class,
String.class, String.class)
.invoke(null, "foo", "bar")
答案 1 :(得分: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;
}
答案 2 :(得分:2)
更改此
Method method = targetClass.getDeclaredMethod(methodName, null);
到类似的东西
Method method = targetClass.getDeclaredMethod(methodName, Class<?>... parameterTypes);
以及您的provideMethod
。