据说分析java类结构对日后的编码优化有很大的帮助,同时它也是我们理解java虚拟机类加载,内存分配,解析的基础,就和小伙伴们一起探讨学习了一番!
先来张大图做个导向:
1. 我们首先要搞明白.class文件是咋来的,为啥要有.class文件?
我们知道在JDK里面执行一个javac就能将java文件解析成了class文件,资料上说,代码编译的结果是将本地机器码转为字节码,也就是我们的class文件。
我们知道JVM的作用就是计算机来执行程序,目的是做到跨平台应用。因此它可以将多种语言编译为字节码为基础的class文件来运行,这样,就不必在乎操作系统和机器指令了,真正实现虚拟机跨平台的效果。
2. class文件由两种数据类型组成,无符号数和表,它都记录了什么东西呢?
说白了,就是记录我们写的java类里面所有信息的。魔数用来标识我是能被JVM识别的class文件,然后记录版本信息,用于对JDK的识别,例如:十进制版本号为51的class文件为1.7版本jdk编译。
常量池是class文件的资源库,记录所有与其他项目相关联的数据类型,就是我所有引用资源的符号引用或者标识符。它包括类和接口的全限定名,字段名称或者描述符,方法名称或者描述符,通过jdk的javap命令可以取得这些信息。例如执行:javap -verbose HellowWord的代码与常量池对比:
import java.util.Scanner;
public class HellowWord{
public static void main(String[] args){
String a="Hellow World";
System.out.println(a);
}
}
对比我们可以看出他们将编写的java代码的每个单词都用符号标识符的形式展现出来了。
类索引确定各个类的继承关系;字段表集合则用于描述类或者接口中的变量,例如作用域,实例变量还是类变量,可变性,并发可见性,可否被序列化,字段数据类型,字段名称。方法表用于标识方法,属性表用于标识属性。
3. 如何code属性读取方法?
class文件通过code属性表,读取属性值,属性长度,最大栈深度,局部变量表存储空间,代码长度,代码值。通过JVM字节码指令表将16进制字节码翻译为字节码指令。
总结:
class文件具备的平台中立,紧凑,稳定和扩展的特点,是java平台实现跨平台,语言无关特性的重要支柱。