JVM源码分析:深入剖析JavaMain方法中的LoadMainClass的实现

经过前文《从JDK源码级深入剖析main方法的运行机制》的分析,我们知道了实现JavaMain方法的四个主要步骤:

  1. 初始化Java虚拟机
  2. 加载主运行类
  3. 通过加载的主运行类,获取main方法
  4. 调用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方法的主要流程代码,下面用一张图总结一下:

posted @ 2023-06-14 18:16  编程老司机A  阅读(235)  评论(0)    收藏  举报