字节码
首先我们需要清楚计算机是不能直接运行JAVA代码的,需要先运行JAVA虚拟机,再由JAVA虚拟机运行编译后的JAVA代码,这个编译后的代码,就是字节码。
为什么jvm不能直接运行java文件呢?
因为在cpu层面来看,计算机所有操作都是一个一个指令去运行汇集而成的,而java代码是高级语言,只有人才能看懂其中的逻辑,计算机是无法识别的,所以java代码必须编译为计算机能看懂的字节码,jvm才能识别代码转换后的指令去运行。
多语言编译为字节码在JVM运行
Java代码间接翻译成字节码,再将字节码文件交由不同平台上的jvm去运行,从而实现一次编写,到处运行。
JVM不止支持java,还有很多编程语言。例:Groovy,Scala,Koltin
Class文件的结构属性:
- 魔数:每个class文件的头四个字节被称为魔数,它的作用就是确定这个文件是一个class文件,光靠文件的名字是不可以的。唯有以"cafe babe"开头的class文件方可被虚拟机所接受,这4个字节就是字节码文件的身份识别。
- 常量池:可以理解为class文件的资源仓库,是class文件中关联最多的数据类型,也是占用class文件最大的数据项目之一。存储的资源有:变量的属性,类型和名称。方法的属性类型名称等
- 访问标志:表示该class的属性和访问类型,是接口还是类,访问类型是不是public,是不是final修饰之类。
- 类索引,父类索引,接口索引:class文件靠这个来识别类的继承关系
- 字段表属性:用于描述类中声明的变量,比如变量的作用域,是否静态,是否final,数据类型等等
- 方发表属性:方法的类型,作用域
- 属性表类型:用于描述某些场景专有的信息,比如字段表中特殊的属性,方法表中特殊的属性