jvm如何进入默认类:
class try1
{
public static void main(String args[])
{
...
}
}
其中jvm如何访问此方法?
在包中如果一个类是默认的,它的公共方法不能从外部访问,那么jvm如何进入这个类?
答案 0 :(得分:9)
调用main
方法不是JVM本身。这是Java启动器的工作,即java.exe
Java启动程序是一个用C编写的小程序,它使用常规的JNI functions:
JNI_CreateJavaVM
创建新的JVM实例并获取JNIEnv
的实例; JNIEnv::FindClass
找到命令行中指定的主类; JNIEnv::GetStaticMethodID
在#2班中查找public static void main(String[])
方法。JNIEnv::CallStaticVoidMethod
调用#3中的方法。事实上,JNI允许您使用所有类,方法和字段,即使使用private
修饰符。
答案 1 :(得分:0)
首先,JVM不会进入该方法,它会调用(调用)它(是的,这很重要)。关键字public
声明可以从任何地方访问该方法(不同packages
); static
关键字声明您可以在不设置class
(以及其他内容)的情况下调用方法,据我所知,包含main方法的类始终为public
。
答案 2 :(得分:0)
如果你正在运行一个可执行jar,你明确地告诉java要在命令行或.jar的Manifest中加载什么类。
Java规范Chapter 12简要介绍了JVM启动时会发生什么。 (JVM规范Chapter 5更详细地介绍了它。)
简而言之:
java try1
将加载try1
类,然后链接,验证,解析并初始化它。
完成后,它会查找public
,static
和void
的主要方法,该方法接受String
的数组,然后它将执行该方法。
JVM并不关心您的班级是否公开。当第一个类加载时,它是当前的编译单元,初始access control是从它计算的。