jvm如何进入public static void main?
jvm如何进入默认类:
class try1 { public static void main(String args[]) { ... } }
在其中jvm如何访问此方法?
在包中如果一个类是默认的,它的公共方法不能从外部访问,那么jvm如何进入这个类?
调用main
方法不是JVM本身。 这是Java启动器的工作,即java.exe
。
Java启动程序是一个用C编写的小程序,它使用常规的JNI函数 :
-
JNI_CreateJavaVM
创建JVM的新实例并获取JNIEnv
的实例; -
JNIEnv::FindClass
用于定位命令行中指定的主类; -
JNIEnv::GetStaticMethodID
用于在类#2中查找public static void main(String[])
方法。 -
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
数组的public
, static
和void
的main方法,然后它将执行该方法。
JVM并不关心您的课程是否公开。 当加载第一个类时,它是当前的编译单元,并从中计算初始访问控制 。