This blog is the follow up blog to answer this question:
Why is the main method in superclass executed by JVM?
class A
{
public static void main(String[] args)
{
System.out.println("A.main");
}
}
class B extends A{ }
If you execute
java B
you will see the console output:
A.main
Before going on, we can take a minute to think why it is works.
java B
is to call main
via JNI by JVM. So, yy viewing the process JVM load the class, we can see why it works clearly:
When JVM start up, it will load and initiate your class and invoke LauncherHelper#checkAndLoadMain
which will validate if B
has main memthod:
validateMainClass(mainClass);
And continue in validateMainClass
, it invokes the Class#getMethod
:
static void validateMainClass(Class<?> mainClass) {
Method mainMethod;
try {
mainMethod = mainClass.getMethod("main", String[].class);
} catch (NoSuchMethodException nsme) {
// invalid main or not FX application, abort with an error
abort(null, "java.launcher.cls.error4", mainClass.getName(),
FXHelper.JAVAFX_APPLICATION_CLASS_NAME);
return; // Avoid compiler issues
}
...
}
Now, we can view the doc of getMethod
:
Let C be the class or interface represented by this object:
C is searched for a matching method, as defined below. If a matching method is found, it is reflected.
If no matching method is found by step 1 then:
If C is a class other than Object, then this algorithm is invoked recursively on the superclass of C.
If C is the class Object, or if C is an interface, then the superinterfaces of C (if any) are searched for a matching method. If any such method is found, it is reflected.
It is clear that getMethod
will invoke recusively up to the root of inheritance tree to find if there exist this method. In this case, it will first check whether B
has main
, not found; then check its superclass – A
. This time, it find main
then invoke it.
Ref
Written with StackEdit.
评论
发表评论