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

本文详细介绍了Java的“一次编译,到处运行”原理,基于class文件的跨平台运行机制。讨论了字节码文件格式,包括魔数、版本号、常量池等关键组成部分,并举例解析了一个简单的类的字节码表示。此外,还提到了字节码指令的分类,并通过泛型方法的字节码示例展示了泛型在字节码层面的体现。建议读者参考官方文档或使用javap工具进一步探究字节码细节。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值