1.简述
java语言具有一处编译,到处运行,该功能实现原理是基于class文件实现的,java格式文件经过编译后生成class文件,jvm加载class文件进行运行,不管什么格式的文件只要能编译成符合规范的class文件,那么就可以在jvm上运行。所以下面研究字节码文件格式。
2.字节码文件格式
package com.xiayu.demo;
public class ClassFile {
private int field;
public void method(){
String a = "test";
String b = new String("b");
System.out.println("method()");
}
}
对应的字节码16进制显示
字节码文件是由魔数,版本号,常量池,访问标志,类索引,父类索引,接口索引,字段表集合,方法,属性组成。
魔数: 4个字节,对应的是16进制的cafe babe,其是表明class文件的标志,class文件也可以通过class后缀来表示,但后缀可以修改,魔数在文件内容上表明该文件是class文件
版本号:上图0000 0034,0000代表次版本号,0034代表主版本号(52),52对应1.8.
常量池:常量池主要包含字面量和符号引用,字面量如文本字符串,final声明的变量等,符号引用主要是类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。如上图字节码文件中:0x0021(33)代表常量池中常量的数量,实际上只有32个常量。
常量池中的信息
访问标志 Access_flag
声明class文件是类还是接口,访问控制权限是public abstract 还是protected等等。
类索引、父类索引和接口索引等
方法
构造方法
method()方法
上述仅仅为字节码的简要描述,更多可以参考官方文档或者使用java自带javap工具进行查看字节码文件内容.
3.字节码指令
字节码指令主要包含加载存储指令,运算指令、类型转换指令、对象创建与访问指令、操作数栈管理指令、控制转移指令、方法调用和返回指令、异常处理指令和同步指令等。
4.泛型的字节码
举例
public T sum(T a,T b){
System.out.println(a);
System.out.println(b);
return b;
}
对应的字节码,通过字节码文件可以看到泛型在字节码文件中具体的类型是Object类型。