先附上 对应的指令大全:
https://www.cnblogs.com/dougest/p/7067710.html。
伙伴们对题目和扩展有什么想法可以在群里分享或者公众号下方留言一起讨论哦,小刀和小伙伴在学习群里等你来一起监督学习
哦,坚持!加油!进群请加小刀微信: **best396975802**
微信公众号:java技术大本营。
部分没有解释的指令可以在上边的指令大全里找到。或者自行解决。哈哈哈,感谢这位网友的分享
这里给大家拓展一点:
如果类中不存在 static静态代码块, 则不会出现 cmd命令图 中的
static {};
descriptor:...... 省略 (可以自行把 static 静态代码块 删除在运行一下javap 测试一下)
这个是常见的.当javap后出现以下的信息时:
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this L com/justest/test/TestDate;
代表它是 局部变量表,start+length表示这个变量在字节码中的生命周期起始和结束的偏移位置(this生命周期从头0
到结尾10)slot就是这个变量在局部变量表中的槽位(槽位可复用),name是变量名称,Signatur是局部变量类型描述
接下来是针对性的解析:
源码图:
image.png
javap 图
image.png
总结一:
1.descriptor:()V 括号是空的,代表无参数 ,V 代表无返回值嘛。
如果是 descriptor: I 代表该变量的类型 是 int。
或者 descriptor: java.lang.string ?: 代表该变量的类型 是string。
2.flags: 代表该方法的修饰情况 。 ACC_STATIC 静态。
3. 0: iconst_0 前面0:表示执行的顺序,iconst_5把值 5 放入栈顶,_5中的5代表压栈的值,如:iconst_5,即把5压
入栈顶。
4.putstatic 设置类中静态字段的值。
5. return: 整个方法结束返回 void。
javap 图拓展:
总结二:
1.Field i : I 表示: Field 翻译为 领域 。这里指的是 栈内存 。指设置了一个
名字为 小写的 i ,其数据类型是 I ,这个大写 I 代表 Integer整数的包装类.
javap 图拓展:
总结三:
1.LineNumberTable:指令与代码行数的偏移对应关系,每一行第一个数字对应代码行数,第二个数字对应前面code中指令
(注意: cmd中显示的东西叫做 指令。)
简单的说: .java文件中 第4行的代码 在执行顺序第 0 行。 Line 4: 就是第4行
javap 图:
总结四:
1.aload_0 从局部变量中加载索引为0的变量的值 (也指引用类型值)。 即this 的引用,压入栈 。
2.invokespecial 出栈,调用java/lang/Object."<init>":()V 初始化对象,就是this指定的对象的init()方法完成
初始化。
(我记得 写 JS的面向对象的时候,function() 中好像也有个 init()的初始化函数)
javap 图:
源码图:
总结五:
1.bipush 将一个8位带符号整数压入栈中。
2.bipush 后边的6 代表 该数值 为6 。
3.putfield 设置对象中字段的值 。
读到这里要注意。 第4行指令到第7行指令的意思:(没有第6行)
当前 this下的 名字为 小写 s 的 一个 8位带符号整数 值为 6 压入栈中。
Javap图:
总结六:
1.iinc 把一个常量值加到一个int类型的局部变量上
iinc 0,1 -- 将变量0 增加1 ,栈顶值仍然是1。其中第一个0 表示变量,第二个1 表示增量。
2.getstatic 从类中获取静态字段。
3.iload_0 从局部变量0中装载int类型值 。(-- 将类型为int的变量0 的 值放入栈项)
以上意思是: 从类中获取静态字段的 值 i = 5, 赋值到局部变量 i 上,然后把一个值加到当前局部变量 i 上: ++i
就等于6 。 并把它入栈。
下边对应代码的 System.out.println();
**invokcvirtual **运行时按照对象的类来调用实例方法。
image
网友评论