java 字节码文件_java字节码文件

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进制显示

9d502a6cc0ece1a67e296391cdcd94f9.png

字节码文件是由魔数,版本号,常量池,访问标志,类索引,父类索引,接口索引,字段表集合,方法,属性组成。

魔数: 4个字节,对应的是16进制的cafe babe,其是表明class文件的标志,class文件也可以通过class后缀来表示,但后缀可以修改,魔数在文件内容上表明该文件是class文件

版本号:上图0000 0034,0000代表次版本号,0034代表主版本号(52),52对应1.8.

常量池:常量池主要包含字面量和符号引用,字面量如文本字符串,final声明的变量等,符号引用主要是类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。如上图字节码文件中:0x0021(33)代表常量池中常量的数量,实际上只有32个常量。

f27a7a99a6e24ffd57f81a077a6d1731.png

常量池中的信息

f1282ed7bae141a32db10a0274d59408.png

访问标志 Access_flag

声明class文件是类还是接口,访问控制权限是public abstract 还是protected等等。

41d8c9d85655d0fd38fa37d74fda7ea0.png

类索引、父类索引和接口索引等

673bdffa561885ea24c355552d54e6a6.png

方法

构造方法

6e2a300627d36e8418e489d603cf7e60.png

method()方法

fd823aa3111961f6360ec45aea79d999.png

上述仅仅为字节码的简要描述,更多可以参考官方文档或者使用java自带javap工具进行查看字节码文件内容.

3.字节码指令

字节码指令主要包含加载存储指令,运算指令、类型转换指令、对象创建与访问指令、操作数栈管理指令、控制转移指令、方法调用和返回指令、异常处理指令和同步指令等。

4.泛型的字节码

举例

public T sum(T a,T b){

System.out.println(a);

System.out.println(b);

return b;

}

对应的字节码,通过字节码文件可以看到泛型在字节码文件中具体的类型是Object类型。

0e15f720f1d73e390ae018b9a5e68026.png


版权声明:本文为weixin_34306878原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。