使用反射调用静态方法

问题描述:

我想调用静态的main方法。我得到了Class类型的对象,但我无法创建该类的实例,也无法调用static方法main使用反射调用静态方法

+3

向我们展示的代码会发生什么事,请。 – 2010-03-18 04:37:28

// 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; 
    } 
} 
+10

为什么不用正确的名称使用getMethod,而不是循环遍历所有的方法? – mjaggard 2013-04-17 10:54:29

+9

由于getMethod(或getDeclaredMethod)要求您详细解决参数类型,有时候通过名称循环和查找方法比使用getMethod更容易。这只取决于微型效率是否重要 - Java迭代非常快速,除非您在内部循环中调用方法数百万次,那么迭代将足够快 – 2013-09-16 08:32:23

+2

同样在更真实的情况下,您可能只会找到方法,即使您要使用反射来多次调用它。所以发现它时额外的开销并不重要。 – RenniePet 2015-11-30 06:54:49

Fromthe Method.invoke()的Javadoc中:

如果底层方法是静态的,则该指定的obj参数将被忽略。它可能为空。

当你

 
Class klass = ...; 
Method m = klass.getDeclaredMethod(methodName, paramtypes); 
m.invoke(null, args)