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是一门设计为运行于虚拟机之上的编程语言,因此 ...
随机推荐
- Java一次性读取文件的内容
我们做文本处理的时候的最常用的就是读写文件了,尤其是读取文件,不论是什么文件,我都倾向于一次性将文本的原始内容直接读取到内存中再做处理,当然,这需要你有一台大内存的机器,内存不够者……可以一次读取少部 ...
- Cross-site request forgery 跨站请求伪造
Cross-site request forgery 跨站请求伪造 简称为CSRF或者XSRF,通过伪装来自受信任用户的请求来利用受信任的网站 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来 ...
- Swing使用Substance外观包异常问题
问题一: 今天更新我的Java版QQ,在网上找到了Substance外观包,效果不错,直接用了,可是设置水印问题时就出现问题,网上有现成的例子 JFrame.setDefaultLookAndFeel ...
- 将本地项目上传到gitlab下
转载自: https://blog.csdn.net/litianxiang_kaola/article/details/74075151 1.安装git https://git-scm.com ...
- MYSQL的基本函数 (加密函数)
AES_ENCRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储 AES_DECRYP ...
- myeclipse新建maven项目
右键 new--->project ---->maven project 出现bank 右键点击bank---->maven4Myeclipse---->new maven ...
- vue 里面引入高德地图
效果图: 实现: 一:引入 高德,web-sdk (两种方式) 1:在html 中引入(我用的这一种) <script type="text/javascript" src= ...
- js数组,字符串,json互相转换函数有哪些
js数组,字符串,json互相转换函数有哪些 一.总结 一句话总结: JSON.stringify(arr) JSON.parse(jsonString) str.split('') array.jo ...
- PHP curl是什么
PHP curl是什么 一.总结 一句话总结:PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯. libcurl库 允许你与各种的 ...
- 20171104xlVBA进退比较
Sub 比对两次成绩() CreateAdvance "进退比较", "月考2", "期中考", "月考2", &quo ...