使用反射调用静态方法
// String.class here is the parameter type, that might not be the case with you
Method method = clazz.getMethod("methodName", String.class);
Object o = method.invoke(null, "whatever");
在情况下该方法是私人使用getDeclaredMethod()
代替getMethod()
。并在方法对象上调用setAccessible(true)
。
String methodName= "...";
String[] args = {};
Method[] methods = clazz.getMethods();
for (Method m : methods) {
if (methodName.equals(m.getName())) {
// for static methods we can use null as instance of class
m.invoke(null, new Object[] {args});
break;
}
}
为什么不用正确的名称使用getMethod,而不是循环遍历所有的方法? – mjaggard 2013-04-17 10:54:29
由于getMethod(或getDeclaredMethod)要求您详细解决参数类型,有时候通过名称循环和查找方法比使用getMethod更容易。这只取决于微型效率是否重要 - Java迭代非常快速,除非您在内部循环中调用方法数百万次,那么迭代将足够快 – 2013-09-16 08:32:23
同样在更真实的情况下,您可能只会找到方法,即使您要使用反射来多次调用它。所以发现它时额外的开销并不重要。 – RenniePet 2015-11-30 06:54:49
Fromthe Method.invoke()的Javadoc中:
如果底层方法是静态的,则该指定的obj参数将被忽略。它可能为空。
当你
Class klass = ...; Method m = klass.getDeclaredMethod(methodName, paramtypes); m.invoke(null, args)
向我们展示的代码会发生什么事,请。 – 2010-03-18 04:37:28