JVM源码分析:深入剖析JavaMain方法中的LoadMainClass的实现
经过前文《从JDK源码级深入剖析main方法的运行机制》的分析,我们知道了实现JavaMain方法的四个主要步骤:
- 初始化Java虚拟机
- 加载主运行类
- 通过加载的主运行类,获取main方法
- 调用main函数
下面,我们首先来看一下第2步加载主运行类LoadMainClass方法的具体实现细节。
上代码:
static jclass LoadMainClass(JNIEnv *env, int mode, char *name)
{
jmethodID mid;
jstring str;
jobject result;
jlong start = 0, end = 0;
//获取Java核心rt.jar包中Java启动辅助类sun.launcher.LauncherHelper
jclass cls = GetLauncherHelperClass(env);
NULL_CHECK0(cls);
if (JLI_IsTraceLauncher()) {
start = CurrentTimeMicros();
}
//获取sun.launcher.LauncherHelper的checkAndLoadMain方法句柄
NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
"checkAndLoadMain",
"(ZILjava/lang/String;)Ljava/lang/Class;"));
// 将name这个字符串指针转化成jstring字符串类型
NULL_CHECK0(str = NewPlatformString(env, name));
//调用sun.launcher.LauncherHelper的checkAndLoadMain方法
NULL_CHECK0(result = (*env)->
CallStaticObjectMethod(env, cls, mid, USE_STDERR, mode, str));
if (JLI_IsTraceLauncher()) {
end = CurrentTimeMicros();
printf("%ld micro seconds to load main class\n", (long)(end-start));
printf("----%s----\n", JLDEBUG_ENV_ENTRY);
}
return (jclass)result;
}
至此,我们分析完了JavaMain方法的主要流程代码,下面用一张图总结一下:



浙公网安备 33010602011771号