for循环的字节码
源代码:
public class Wizard {
private int age; private void forCycle() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
javap -v -p Wizard.class 得到class文件:
Classfile /D:/Users/Administrator/workspace/TestJava/bin/com/bytecode/Wizard.class
Last modified 2018-3-17; size 545 bytes
MD5 checksum 529c4f32d75aa1bdce39f2b8fa128d76
Compiled from "Wizard.java"
public class com.bytecode.Wizard
SourceFile: "Wizard.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER Constant pool:
#1 = Class #2 // com/bytecode/Wizard
#2 = Utf8 com/bytecode/Wizard
#3 = Class #4 // java/lang/Object
#4 = Utf8 java/lang/Object
#5 = Utf8 age
#6 = Utf8 I
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Methodref #3.#11 // java/lang/Object."<init>":()V
#11 = NameAndType #7:#8 // "<init>":()V
#12 = Utf8 LineNumberTable
#13 = Utf8 LocalVariableTable
#14 = Utf8 this
#15 = Utf8 Lcom/bytecode/Wizard;
#16 = Utf8 forCycle
#17 = Fieldref #18.#20 // java/lang/System.out:Ljava/io/PrintStream;
#18 = Class #19 // java/lang/System
#19 = Utf8 java/lang/System
#20 = NameAndType #21:#22 // out:Ljava/io/PrintStream;
#21 = Utf8 out
#22 = Utf8 Ljava/io/PrintStream;
#23 = Methodref #24.#26 // java/io/PrintStream.println:(I)V
#24 = Class #25 // java/io/PrintStream
#25 = Utf8 java/io/PrintStream
#26 = NameAndType #27:#28 // println:(I)V
#27 = Utf8 println
#28 = Utf8 (I)V
#29 = Utf8 i
#30 = Utf8 StackMapTable
#31 = Utf8 SourceFile
#32 = Utf8 Wizard.java
{
private int age;
flags: ACC_PRIVATE public com.bytecode.Wizard();
flags: ACC_PUBLIC Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/bytecode/Wizard; private void forCycle();
flags: ACC_PRIVATE Code:
stack=2, locals=2, args_size=1
0: iconst_0
1: istore_1
2: goto 15
5: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;
8: iload_1
9: invokevirtual #23 // Method java/io/PrintStream.println:(I)V
12: iinc 1, 1
15: iload_1
16: bipush 10
18: if_icmplt 5
21: return
LineNumberTable:
line 7: 0
line 8: 5
line 7: 12
line 10: 21
LocalVariableTable:
Start Length Slot Name Signature
0 22 0 this Lcom/bytecode/Wizard;
2 19 1 i I
StackMapTable: number_of_entries = 2
frame_type = 252 /* append */
offset_delta = 5
locals = [ int ]
frame_type = 9 /* same */ }
分析for循环的字节码:
字节码 | 描述 | 操作数栈 |
iconst_0 | 0入栈 | 0 |
istore_1 | 把0赋值给局部变量i | |
goto 15 | 跳转到第15行 | |
iload_1 | 局部变量i的值入栈 | 0 |
bipush 10 | 10入栈 | 0, 10 |
if_icmplt 5 | 比较0和10,小于则跳到第5行 | |
getstatic #17 | System.out入栈 | Systme.out |
iload_1 | 局部变量i的值入栈 | System.out, 0 |
invokevirtual #23 | 调用print方法 | |
iinc 1, 1 | 局部变量i自增1 | |
iload_1 | 把i的值入栈 | 2 |
for循环的字节码的更多相关文章
- Python逆向(五)—— Python字节码解读
一.前言 前些章节我们对python编译.反汇编的原理及相关模块已经做了解读.读者应该初步掌握了通过反汇编获取python程序可读字节码的能力.python逆向或者反汇编的目的就是在没有源码的基础上, ...
- 深入字节码理解invokeSuper无限循环的原因
来一段简单的cglib代码 public class SampleClass { public void test(){ System.out.println("hello world&qu ...
- lua执行字节码的过程介绍
前面一篇文章中介绍了lua给下面代码生成最终的字节码的整个过程,这次我们来看看lua vm执行这些字节码的过程. foo = "bar" local a, b = "a& ...
- Android 从java字节码告诉你 为什么Handler会造成内存泄露
很多人面试的时候,都知道Handler 极易造成内存泄露,但是有一些讲不出来为什么,好一点的 会告诉你looper msg 之类的,但是你再往下问 为什么msg持有handler handler为什么 ...
- JVM 字节码执行实例分析
前言 最近在看<Java 虚拟机规范>和<深入理解JVM虚拟机>,对于字节码的执行有了进一步的了解.字节码就像是汇编语言,是 JVM 的指令集.下面我们先对 JVM 执行引擎做 ...
- Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码--转载
在本系列的最后三篇文章中,我展示了如何用 Javassist 框架操作类.这次我将用一种很不同的方法操纵字节码——使用 Apache Byte Code Engineering Library (BC ...
- Java虚拟机--字节码指令集
1. 字节码指令集简介: Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成.虚拟机中许多指 ...
- 掌握Java字节码(转)
Java是一门设计为运行于虚拟机之上的编程语言,因此它需要一次编译,处处运行(当然也是一次编写,处处测试).因此,安装到你系统上的JVM是原生的程序,而运行在它之上的代码是平台无关的.Java字节码就 ...
- Java字节码基础[转]
原文链接:http://it.deepinmind.com/jvm/2014/05/24/mastering-java-bytecode.html Java是一门设计为运行于虚拟机之上的编程语言,因此 ...
随机推荐
- OpenLayers中的球面墨卡托投影
最近看OpenLayers,研究到地图投影时找到官方的文档,就翻译了一下,由于英文能力差,翻译不好的地方,请看原文 原文地址:http://docs.openlayers.org/library/sp ...
- _talent_req
学习天赋时,将产生消耗,当玩家已经学习过该天赋时,不产生消耗 comment 备注 spellId 天赋技能ID reqId 消耗模板ID,对应_req表中reqId
- Linux——vi的使用
记录一下vi的一些使用指令,蓝色部分是比较常用的,其中使用过的重新进行了描述,极少部分是未使用过的,还有一些未使用也未记录进来,后续再来补充修正: 参考资料:http://cn.linux.vbird ...
- Python缩进与if语句 空格的魅力
缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这是C,不是Python! ...
- 史上最全Java面试题(带全部答案)
今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次.对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦.在跳槽季来临之前,特地做这 ...
- [原][unreal][UE][spark]分析unreal engine 虚幻引擎的粒子编辑器:Cascade
参考:https://www.raywenderlich.com/270-unreal-engine-4-particle-systems-tutorial (使用了一个飞机射击游戏的粒子来展示,全英 ...
- 学习笔记6—pandas中ix,loc,iloc有什么区别?
直接看例子: >>> data = pd.Series(np.arange(10), index=[49,48,47,46,45, 1, 2, 3, 4, 5]) >>& ...
- Lua报错:invalid key to 'next'
1.问题产生的原因是,在一个循环里对table中的元素先进行置空操作,再进行增加新元素的操作,就会报这个错误. 2.比如下面的例子:(当中间的函数足够复杂并进行封装了的情况下,不会留意到存在这个问题) ...
- 微信小程序不可操作dom节点
//根据历史记录快速搜索 fastSearch:function(e){ console.log(e.currentTarget.id) wx.navigateTo({ url: '../search ...
- 雇佣K个工人的最小费用 Minimum Cost to Hire K Workers
2018-10-06 20:17:30 问题描述: 问题求解: 问题规模是10000,已经基本说明是O(nlogn)复杂度的算法,这个复杂度最常见的就是排序算法了,本题确实是使用排序算法来进行进行求解 ...