jvm如何进入public static void main?

jvm如何进入默认类:

class try1 { public static void main(String args[]) { ... } } 

在其中jvm如何访问此方法?

在包中如果一个类是默认的,它的公共方法不能从外部访问,那么jvm如何进入这个类?

调用main方法不是JVM本身。 这是Java启动器的工作,即java.exe
Java启动程序是一个用C编写的小程序,它使用常规的JNI函数 :

  1. JNI_CreateJavaVM创建JVM的新实例并获取JNIEnv的实例;
  2. JNIEnv::FindClass用于定位命令行中指定的主类;
  3. JNIEnv::GetStaticMethodID用于在类#2中查找public static void main(String[])方法。
  4. JNIEnv::CallStaticVoidMethod用于调用#3中的方法。

事实上,JNI允许您使用所有类,方法和字段,甚至使用private修饰符。

首先,JVM不会进入该方法,它会调用(调用)它(是的,这很重要)。 关键字public声明可以从任何地方(不同的packages )访问该方法; static关键字声明你可以在没有实例化class情况下调用方法(除其他外),据我所知,包含main方法的类总是public

如果你正在运行一个可执行jar,你明确告诉java在命令行或.jar的Manifest中加载什么类。

Java规范第12章简要介绍了JVM启动时会发生什么。 (JVM规范第5章更详细地介绍了它。)

简而言之: java try1将加载try1类,然后链接,validation,解析和初始化它。

一旦完成,它将寻找一个接受String数组的publicstaticvoid的main方法,然后它将执行该方法。

JVM并不关心您的课程是否公开。 当加载第一个类时,它是当前的编译单元,并从中计算初始访问控制 。