JVM
Yui_Hatano
生活不易,唯有奋斗不息。
展开
-
Class格式(一)魔数和版本号
大家都知道,JAVA文件通过javac的命令编译生成类文件,类文件再通过java的命令就能运行出我们写的代码了,今天就来研究一下类文件。class文件的c定义的结构体struct ClassFile{ u4 magic; //识别Class文件格式,具体值为0xCAFEBABE, u...原创 2018-04-10 00:56:35 · 732 阅读 · 0 评论 -
Class格式(二)常量池信息
上一篇已经对前面八个字节做了简单的介绍,今天就来说说剩下的一部分。下面用两个字节来表示常量池个数,后面具体的就是常量池信息。使用一个字节表示tag,一个集合来表示具体信息。可根据下图来查询具体表示的信息还是根据昨天的class文件来做分析,001D表示常量池个数,计算一下是29,就是01-28,一共有28个常量,00作为保留位。下面就是常量池的具体信息了。第一位字节表示tag,根据以上表可以查到第...原创 2018-04-11 10:52:07 · 465 阅读 · 0 评论 -
Class格式(三)访问标志
上一篇文章已经说完了常量池的结构定位到字节码,如图所示。接下来占用的两个字节就是访问标志,这个标志用于识别一些或接口层次的访问信息,包括:这个class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final,等等。具体的标志五个一标志的含义如下表:通过组合的方式组合在一起,00 21 可以推断除是由ACC_PUBLIC和ACC_SUPER通过...原创 2018-04-11 21:39:40 · 698 阅读 · 0 评论 -
Class文件(四)类索引
上篇已经说完了access_flags,现在开始下面的,下面两个字节就是类名,然后两个字节是父类名,都知道java是单继承,多实现,所以父类只可能是一个。再下面两个字节是接口数量,再下面是各接口的名称。上次分析到0021,然后00 05,对应的就是位置就是第五个常量池保存的类名,再然后00 06,对应的就是位置就是第六个常量池保存的父类名,后面的接口个数以及接口名都没有所以用00 00 表示。用命...原创 2018-04-11 22:24:33 · 509 阅读 · 0 评论 -
Class格式(五)字段表集合
下面就到了字段表集合,重新修改源代码public class Test { private int a; public byte b; public static Object obj; protected Object[] objs;}增加四个字段。下面两个字节就是字段个数,00 04表示有4个字段,下面就是字段信息,字段信息的结构体第一个字段:00 02 表示修饰符为private ,...原创 2018-04-11 23:12:32 · 816 阅读 · 0 评论 -
Class格式(六)方法表集合
下面就开始介绍方法表重新修改源代码,增加一个方法public class Test { private int a; public byte b; public static Object obj; protected Object[] objs; public int add(int a,int b){ return a+b; }}下面两个字节表示方法个数,00 02表示有两个方法,...原创 2018-04-12 00:00:56 · 942 阅读 · 0 评论 -
字节码与数据类型
1.在虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息。2.lload (将int类型数加载到栈中)fload(将float类型加载到栈中)大多数指令是包含类型信息的。3.一个指令占一个字节,最多表示256种4.也有不包含信息类型的 如goto 与类型无关 ,Arraylength 操作数组类型5.类型多,指令少。...原创 2018-04-13 23:38:43 · 809 阅读 · 0 评论 -
指令集
一。加载和存储指令 1. 加载和存储指令用于将数据在栈帧的局部变量表和操作数栈之间来回传输。 2. 将局部变量表加载到操作数栈:iload lload fload dload aload 3. 将一个数值从操作数栈存储到局部变量表中:istore lofa 4.将一个常量加载到操作数栈:bipush sipush ldc ldc_w ldc2_w acons...原创 2018-04-14 01:54:45 · 1562 阅读 · 0 评论