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是一门设计为运行于虚拟机之上的编程语言,因此 ...
随机推荐
- C#支付宝多次回调问题
//必须删除掉页面上的默认内容,不然支付宝会多次回调 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&q ...
- 理解 Redis(2) - 手把手教你理清 Redis 安装全过程
Redis 官网 https://redis.io/ 之前学习 Redis 学了好多次, 下载安装也都按照教程或官网文档弄过, 但是对于安装过程一直有点迷糊, 感觉稀里糊涂地就好了, 就可以用了. 这 ...
- vi/vim 基本使用方法
vi/vim 基本使用方法本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了!i/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所 ...
- C# 用面向对象的思想去编程
再接上一篇博文,之前写的两篇博文虽然实现了功能,但是和控件之间的粘性太大,依赖于控件进行操作,所以这篇博文主要用面向对象的思想做一个Demo,将逻辑层与显示层剥离开 首先新建一个窗体文件,搭建界面完毕 ...
- 如何用git把本地代码上传到github
注册账户以及创建仓库 要想使用github第一步当然是注册github账号了.之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之 ...
- ASP.net 网站开发知识点总结
一.常用技术概括及介绍 1. SQL server:处理数据库的设计 2. asp.net 3. html :前端网页 4. css :网页的布局设计 5. JavaScrip ...
- Qt532的QString输出各种编码的16进制数组(测试代码)
环境:Win7x64.Qt5.3.2 MSVC2010 OpenGL.vs2010 1.只测试了 4种:Utf8.Latin1.Local8Bit.unicode 2.测试代码:(这个是 " ...
- [转]pugixml使用教程
转自:https://www.cnblogs.com/ltm5180/p/3989125.html pugixml介绍 pugixml是一个高性能.轻量级并且简单易用的xml解析库,支持UTF8 en ...
- Python 读写操作Excel —— 安装第三方库(xlrd、xlwt、xlutils、openpyxl)
数据处理是 Python 的一大应用场景,而 Excel 则是最流行的数据处理软件.因此用 Python 进行数据相关的工作时,难免要和 Excel 打交道. 如果仅仅是要以表单形式保存数据,可以借助 ...
- (转)c# 扩展方法
扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型.扩展方法必须是静态方法,可以像实例方法一样进行调用.且调用同名中实际定义的方法优先级要高于扩展方法. 先来 ...