1 dljd,reyco郭,ssm经典教程,p15,Java命令的执行过程
- .java类的执行过程是
- 第一步:javac命令,使用编译器把.java文件编译成.class文件。
- 第二步:java命令,解释器运行.class文件。
- java命令(javac、java)的底层工作流程
- 第一步:启动虚拟机,jvm.dll
- 虚拟机的程序在哪呢?在jdk里面吧,我们来到jdk的安装目录,找找看。注意,因为我们是要运行的,所以虚拟机是在jre文件夹中放着的。看到没,这是客户端的java虚拟要。因为这就是用C和C++写的java虚拟机程序,所以它是一个.dll文件(动态链接库):
看到没,这是服务端的java虚拟机:
那客户端的java虚拟机和服务器端的java虚拟机这里就不具体讲了,有兴趣的同学自己去研究。 - 现在运行的是客户端的java虚拟机还是服务器端的java虚拟机呢?cmd,java -version:
当然,你也可以通过一些配置,去选择运行客户端的java虚拟机。感兴趣的同学可以去网上查,这里就不说了。
- 虚拟机的程序在哪呢?在jdk里面吧,我们来到jdk的安装目录,找找看。注意,因为我们是要运行的,所以虚拟机是在jre文件夹中放着的。看到没,这是客户端的java虚拟要。因为这就是用C和C++写的java虚拟机程序,所以它是一个.dll文件(动态链接库):
- 第二步:虚拟机启动后,会自动加载“引导策略类加载器”,用于加载java的核心类库
- 引导策略类加载器是干嘛的?用于加载我们java里面的核心类库。
- 核心类库里面最重要的一个类库是谁?就是jre/lib下的rt.jar这个类库,我们那些最基本的java类都是放在这里面的吧:
- 反问你,rt.jar什么时候被加载进去的?就是虚拟机一启动,马上就会自动加载“引导策略类加载器”。然后“引导策略类加载器”,就自动把java核心类库(包括rt.jar)加载进来了,就是这个时候。
- 第三步:“引导策略类加载器”自动加载ExtClassLoader对象(ext类加载器对象)和AppClassLoader对象(app类加载器对象),加载进来了。
- 第四步:ExtClassLoader对象(ext类加载器对象),用于加载那些扩展的.jar包(类库),了解即可,如下图所示:
- 第五步:最关键的是,AppClassLoader对象(app类加载器对象)加载我们自定义的类(如 HelloWorld.java)
- 我们自定义的来是什么加载进来的?如何加载进来的?就是通过“AppClassLoader对象(app类加载器对象)”加载进来的。
- “AppClassLoader对象(app类加载器对象)”会去哪里去找我们自定义的类的.class文件呢?
- 首先,它会判断在系统变量中有没有设置classpath。
- 如果设置了classpath环境变量,它就按照classpath的那些路径顺序,逐个地查找,有没有我们自定义的类的.class文件。如果没找到,就报NoSuchClassException。
- 因为classpath里这放了很多路径,你可以放很多路径吧。
- 如果没有设置classpath环境变量,它会去哪里找我们自定义的类的.class文件?它会在当前路径下进行查找我们自定义的类的.class文件。如果没找到,仍然会报NoSuchClassException。
- 如果当前路径下有这个自定义的类的.class文件,而且我又设置了classpath环境变量。
- 如果classpath变量中有".;(当前路径,也是查找的范围)",它会在当前路径下和classpath下同时查找。
- 如果classpath变量中没有".;(当前路径,也是查找的范围)",它不会在当前路径进行查找,它只会找的是classpath。
- 如果设置了classpath环境变量,它就按照classpath的那些路径顺序,逐个地查找,有没有我们自定义的类的.class文件。如果没找到,就报NoSuchClassException。
- 首先,它会判断在系统变量中有没有设置classpath。
- 第一步:启动虚拟机,jvm.dll