我想調用靜態的main
方法。我得到了Class
類型的對象,但我無法創建該類的實例,也無法調用static
方法main
。使用反射調用靜態方法
回答
// 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)
- 1. 使用反射的靜態方法
- 2. 使用反射調用通用類的靜態方法
- 3. 使用反射動態調用方法
- 4. 使用反射調用java/groovy對象的靜態方法
- 5. 使用反射C調用靜態類的方法#
- 6. 使用反射調用主類中的靜態方法
- 7. 使用反射來調用靜態方法的返回值
- 8. 如何使用反射(Java)調用私有靜態方法?
- 9. 反射:在靜態方法中獲取調用對象
- 10. 通過從PowerShell反射來調用靜態方法
- 11. 使用方法調用靜態方法?
- 12. 使用反射調用包含通用參數的靜態方法
- 13. 使用反射調用靜態方法時出現錯誤的返回值?
- 14. 使用反射調用傳遞Lamba作爲參數的靜態泛型方法
- 15. 使用反射的Java調用方法
- 16. 使用反射調用方法
- 17. 使用反射的調用方法
- 18. 如何使用反射調用方法
- 19. 使用反射的調用方法
- 20. 使用反射調用方法列表
- 21. Android/Java:使用反射調用方法?
- 22. 靜態方法的類反射
- 23. 使用反射來獲取靜態方法將其參數
- 24. 使用反射運行靜態方法與出參數
- 25. 使用反射捕獲方法狀態
- 26. 如何用用戶提供的參數調用靜態方法(反射)
- 27. 如何使用反射調用動態對象的方法
- 28. 在scala中使用反射的動態對象方法調用
- 29. 在C#中使用反射調用動態方法
- 30. 非靜態調用靜態方法
向我們展示的代碼會發生什麼事,請。 – 2010-03-18 04:37:28