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是一门设计为运行于虚拟机之上的编程语言,因此 ...
随机推荐
- There is no Action mapped for namespace / and action name .解答
做struts2登陆检验的时候遇到了一个问题: 输入http://localhost/login_validation/的目的是想显示 文件夹下的文件列表,无奈,使用struts框架,web.xml设 ...
- 【Java】【事件处理机制】
import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.Actio ...
- 异步加载script,提高前端性能(defer和async属性的区别)
一.异步加载script的好处 为了加快首屏响应速度,前端会采用代码切割.按需加载等方式优化性能.异步加载script也是一种前端优化的手段. 就好比如果我的页面其中一个功能需要打开地图,但是地图的j ...
- 真刀实战地搭建React+Webpack+Express搭建一个简易聊天室
一.前面bb两句 因为自惭(自残)webpack配置还不够熟悉,想折腾着做一个小实例熟悉.想着七夕快到了,做一个聊天室自己和自己聊天吧哈哈.好了,可以停止bb了,说一下干货. 二. 这个项目能学到啥? ...
- _itemmod_add
命令._add items XXX 为目标添加一组物品 `comment` 备注 `categoryId` 组ID `entry` 物品entry `count`数量
- webbench高并发测试
安装ctags sudo apt-get install ctags 安装webbench 下载webbench http://home.tiscali.cz/~cz210552/distfiles/ ...
- tchart5
https://blog.csdn.net/wuyuanjingni/article/details/8585810
- 雷林鹏分享:现实生活中的 XML
现实生活中的 XML 如何使用 XML 来交换信息的一些实例. 实例:XML 新闻 XMLNews 是用于交换新闻和其他信息的规范. 对新闻的供求双方来说,通过使用这种标准,可以使各种类型的新闻信息通 ...
- English trip V1 - B 14. There Are Flowers in My Office 我办公室里有花 Teacher:Lamb Key: There be(is/are)
In this lesson you will learn to describe a room or place. 这节课讲学习描述一个房间或地方 课上内容(Lesson) 1. Where do ...
- 20170824xlVBA出车对账单
Private Sub GetClientAccountList() Dim EndRow As Long Dim i As Long, j As Long Dim m As Long, n As L ...