当调用另一个类中存在的"main"时,很容易说:
otherClass.main(stringArgs);
首先使用反射来获取类,然后调用方法,而不是以静态方式调用它,这背后的原因是什么?
原因可能是,如果使用反射,则不需要对调用其main
方法的类具有编译时依赖关系。您可以使用Class.forName(...)
动态加载类,然后使用反射找到main
方法并调用它
String name = "com.mycompany.MyMainClass";
// Load the class dynamically
Class<?> mainClass = Class.forName(name);
// Find the 'main' method that takes a string array
Method mainMethod = mainClass.getMethod("main", new Class<?>[] { String[].class });
// Invoke the method; first arg is null, because the method is static
mainMethod.invoke(null, new String[] { "one", "two" });
我不知道你为什么要这么做。我从来没有需要用这种方式调用另一个主要方法,除非我在做一些棘手的或实验。
但通常情况下,当您对正在调用的类了解不够时,或者当您搜索和调用标有注释的方法时,您会使用反射来调用方法,而不是直接调用它。
这就是反思的意义所在。
使用反射有很多原因。但是,如果您有一个类的实例(如果我们谈论的是静态方法,则为类的名称),并且知道要调用的方法的名称(在编译时),则不应该使用反射。
举个例子,使用反射的一个原因是,如果出于某种原因,您有一个包含方法名的String
(假设您是从用户那里得到的),并且想要调用特定类的此方法。显然不能只说otherClass.methodName
,因为methodName
会根据用户输入的内容而有所不同。
在大多数需要调用main
的用例中,它是在构建时不知道类的上下文中,甚至可能不在进行调用的代码库中。这可能就是为什么你最经常看到main
的反思性呼叫的原因。
实际上,静态地调用main
没有什么意义。