您现在的位置是:首页 > 游戏攻略

【JVM字节码】Class文件与字节码,机器码的关系

掌游情报站 2025-10-29【游戏攻略】249人已围观

简介class字节码class文件(二进制)和字节码(十六进制)的关系class文件是经过编译器编译后的文件(如javac),一个class文件代表一个类或者接口;class文件主要存储的是字节码,字节码是访问jvm的重要指令,在后面的章节中会介绍字节码的相关信息。jvm规范定义了class文件结构格式...

class字节码


class文件(二进制)和字节码(十六进制)的关系

class文件是经过编译器编译后的文件(如javac),一个class文件代表一个类或者接口;class文件主要存储的是字节码,字节码是访问jvm的重要指令,在后面的章节中会介绍字节码的相关信息。jvm规范定义了class文件结构格式,每种jvm实现必须满足规范定义,这样jvm实例才能加载class文件,运行字节码内容。但jvm的实现可以在jvm规范的约束下对具体实现做出修改和优化(如自定义属性信息,jvm会忽略不认识的属性表)。class文件的内容(.class文件本身是2进制)一般是16进制的数。JVM加载的Class文件不一定来自磁盘,还可以来自网络数据,甚至在运行时直接编译代码字符串生成。---------节选《深入了解虚拟机》

机器码我理解是CPU的指令集。字节码是由opcode(操作码)和操作数组成的。class文件并不叫字节码,class文件是由字节码组成的。字节码你可以理解为是JVM的指令。JVM是一个运行在CPU上的程序,JVM本身是由一条条机器码组成的,它的功能是读取一条条字节码,并在CPU上执行。

也就是说是将二进制的文件加载JVM时,JVM将使用十六进制的方式读取class文件中的字节码(编译期间就确定好了)

.java和.class的区别

java文件是源文件,通过javac命令编译后生成.class文件;.class文件是字节码结文件,即.java文件编译后的代码。

class文件全名称为Javaclass文件,主要在平台无关性和网络移动性方面使Java更适合网络。

通俗来说java文件就是这样一个未经编译的源程序,一般是给程序员看的。class文件就是被编译器编译过的java文件,通常是给计算机看的。

也就是说.java是我们开发语言.class生成的16进制字节码是方便机器看的因为java源文件存在太多换行导致内存占用过多(机器不会识别空格)

jvm规范和Java规范是不同的不能拿java的思维去套用jvm

示例
publicclassMyTest1{privateinta=1;publicintgetA(){returna;}publicvoidsetA(inta){=a;}}

执行

//打印公有信息//将私有的方法信息也打印出来

得到对应字节码

Lastmodified2020-9-13;size375bytesMD5checksum8ba81fc79a80d987e02b14067a155703Compiledfrom"":0majorversion:52flags:ACC_PUBLIC,ACC_SUPERConstantpool:4.2=Fieldref18//com/example/demo/com/jvm/bytecode/:I19//com/example/demo/com/jvm/bytecode/MyTest120//java/lang/Object6=Utf8I8=Utf8()V10=Utf8LineNumberTable12=Utf8()I14=Utf8(I)V16=:18=NameAndType6//a:I20=Utf8java/lang/Object{();descriptor:()Vflags:ACC_PUBLICCode:stack=2,locals=1,args_size=10:aload_01:invokespecial2//Fielda:I9:returnLineNumberTable:line3:0line5:4publicintgetA();descriptor:()Iflags:ACC_PUBLICCode:stack=1,locals=1,args_size=10:aload_01:getfield2//Fielda:I5:returnLineNumberTable:line12:0line13:5}SourceFile:""
字节码整体结构


class文件只有两种数据类型:无符号数和表

字节码结构

这里面表就类似常量池是一种数据结构的复合形式

方法区包含如下内容

字节码整体结构

字节码解释



很赞哦!(91)