美文网首页
01 字节码的二进制文件

01 字节码的二进制文件

作者: 山豆豆 | 来源:发表于2019-02-05 16:44 被阅读0次

我们先编写最简单的helloworld,然后用sublime打开class文件。如下:

这里我只截取部分做参考,而这段二进制文件会拿给JVM执行,不同平台,JVM会根据这些二进制文件产生不同的指令,从而实现跨平台。

这些二进制文件实际上也是按照规则排列好的,每个位置占多少字节,表示什么意思都有一定的规则,如下:

u1 u2 分别表示占一个字节,两个字节。上图中cafe占了四个字节,依次类推。_info结尾的相当于一个表,而这个表占多少内容,要查相应的表结构分析。

首先开头的cafebabe是魔数,用来表示这是Java的文件,不同的文件有不同的魔数。class文件都是相同的,接着0000 0034表示Java版本,前者表示次版本号,后者表示主版本号的十六进制表示方式,jd1.1为45,对应jdk1.8就是52(45+7)。

接下来就是比较重要的概念:001d 两个字节表示常量池的容量,0用于表示不引用任何一个常量池项目。所以我们需要减一才是总共的常量项数。根据最开始的图,我们这里接下来解析表,第一个字节表示标置,用于查找具体的表类型,对应关系如下:

于是我们可以发现我们接下来要找0a对应标志10,然后再去找10对应表的结构图。如下:

接着00 06就表示我要找的下一个常量的索引值,就这样解析完所有二进制文件后对应之间的调用关系等也相应确定下来。

实际上Javap -v 你的类名.class  就可以很方便的看到相应的引用关系:

同理我只截取部分:

当然,上面描述的不只是常量项引用关系,也有相关属性,字段,接口等等。

相关文章

  • java 字节码

    字节码: 1: 字节码结构,class文件的二进制文件意义2: 现有的字节码技术,asm与javasist3: d...

  • 编译器和解释器

    机器码和字节码 字节码是一种中间状态(中间码)的二进制代码(文件) 机器码也是二进制代码,是电脑CPU直接读取运行...

  • javassist文档翻译(一)

    1、读和写字节码 Javassist是一个处理Java字节码的库,java字节码是使用二进制格式存储在文件中的话,...

  • Java命令显示找不到或无法加载主类

    Java与Javac javac命令是将.java的源文件编译成字节码的.class二进制字节码文件 例如编写一个...

  • Class文件

    字节码文件里面是什么? 源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,它的内容是JV...

  • java常见知识点

    java源程序先经过javac编译器编译成二进制的.class字节码文件(跨平台指的是.class字节码文件的跨平...

  • Javassist之字节码读写

    Javassist是一个用于处理Java字节码的类库。Java字节码是一个以二进制文件进行存储的class文件。每...

  • Javassist之字节码读写

    Javassist是一个用于处理Java字节码的类库。Java字节码是一个以二进制文件进行存储的class文件。每...

  • 003-005:Java平台相关的面试题

    本文首发于公众号:javaadu 003:字节码是什么? 在Java中,字节码存放于以.class结尾的二进制文件...

  • Java基础1-5问

    01 Java源程序文件的后缀是?Java字节码文件的后缀名称是? Java源程序后缀是【.java】,字节码文件...

网友评论

      本文标题:01 字节码的二进制文件

      本文链接:https://www.haomeiwen.com/subject/uplvsqtx.html