这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」
java从编码到执行
- X.java文件经过了javac命令后生成了X.class文件
- X.class文件经过classLoader引入之后,又在java类库寻找需要的类
- 按需要给字节码解释器和JIT进行处理
- 最后由执行引擎执行
JDK和JVM是什么关系呢?
-
JDK:英文全称 Java Development Kit,是Java的开发工具包 JDK是提供给Java开发人员使用的,其中包含了
Java的开发工具
和JRE
。其中的开发工具包括:编译工具(javac.exe)打包工具(jar.exe)等。通俗的说就是开发用的。 -
JRE:英文全称 Java Runtime Environment,是Java运行环境 JRE包括
Java虚拟机 (JVM Java Virtual Machine)
和Java程序所需的核心类库
等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。通俗的说就是运行用的。 -
JVM:英文全称 Java Virtual Machine,是java虚拟机。 它只认识
.class
为后缀的文件,它能将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作。JVM是java能够跨平台的核心机制。通俗的说就是跨平台用的,就是把我们写的代码,转换成class文件用的。JDK JRE JVM的区别? JVM是java运行依赖的虚拟机系统。 在JDK基础上,还需要一些核心类库的支持,也就是JRE。 而在JRE基础上,又增添了一些针对开发人员使用的各种工具,就是JDK了。
ClassFileFormat
我们知道,一个java文件被编译后,会变成另一个class文件。
那么编译完成后的class文件内部是什么样子的呢?
以一下文件为例
package jacquesh.jvm.study; public class Test001 { }
当执行编译后
package jacquesh.jvm.study; public class Test001 { public Test001() { } }
可以看出编译后会自动生成一个无参构造方法,因为一个类在没有指定构造方法的时候,其实会自动生成一个无参构造。 但实际此时看到的class文件也还是代码形式。 但实际上,这是idea帮我们自己进行了反编译而已,真正的class文件肯定不是这样的。
我们使用
notepad++
打开这个class文件
可以看出class文件真实存在的其实是一堆16进制的编码