//源代码
class TT{
static int tt = 5;
int t;
public TT(){
System.out.println("TT");
}
}
public class ArrayTest extends TT{
public ArrayTest(){
super();
System.out.println("test");
}
static {
int c = 5;
}
static int b = 1;
int A[] = {1,4,5,12,34,123,14,32};
static {
int d = 6;
}
public static void main(String[] args) {
ArrayTest a = new ArrayTest();
int i = 2;
System.out.println(a.A[i++]);
System.out.println(i);
}
}
//javap -c 反编译代码
D:\>javap -c TT
Compiled from "ArrayTest.java"
class TT extends java.lang.Object{
static int tt;
int t;
public TT();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
7: ldc #3; //String TT
9: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/St
ing;)V
12: return
static {};
Code:
0: iconst_5
1: putstatic #5; //Field tt:I
4: return
}
D:\>javap -c ArrayTest
Compiled from "ArrayTest.java"
public class ArrayTest extends TT{
static int b;
int[] A;
public ArrayTest();
Code:
0: aload_0
1: invokespecial #1; //Method TT."<init>":()V
4: aload_0
5: bipush 8
7: newarray int
9: dup
10: iconst_0
11: iconst_1
12: iastore
13: dup
14: iconst_1
15: iconst_4
16: iastore
17: dup
18: iconst_2
19: iconst_5
20: iastore
21: dup
22: iconst_3
23: bipush 12
25: iastore
26: dup
27: iconst_4
28: bipush 34
30: iastore
31: dup
32: iconst_5
33: bipush 123
35: iastore
36: dup
37: bipush 6
39: bipush 14
41: iastore
42: dup
43: bipush 7
45: bipush 32
47: iastore
48: putfield #2; //Field A:[I
51: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
54: ldc #4; //String test
56: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/St
ing;)V
59: return
public static void main(java.lang.String[]);
Code:
0: new #6; //class ArrayTest
3: dup
4: invokespecial #7; //Method "<init>":()V
7: astore_1
8: iconst_2
9: istore_2
10: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
13: aload_1
14: getfield #2; //Field A:[I
17: iload_2
18: iinc 2, 1
21: iaload
22: invokevirtual #8; //Method java/io/PrintStream.println:(I)V
25: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
28: iload_2
29: invokevirtual #8; //Method java/io/PrintStream.println:(I)V
32: return
static {};
Code:
0: iconst_5
1: istore_0
2: iconst_1
3: putstatic #9; //Field b:I
6: bipush 6
8: istore_0
9: return
}
//第一部分 父类 请先看静态块部分
//代码详解: --为本人做的注释
D:\>javap -c TT
Compiled from "ArrayTest.java"
class TT extends java.lang.Object{
static int tt; --类静态成员变量
int t; --非静态类成员变量
public TT();
Code:
0: aload_0 --aload_0 装载局部变量0位置对象压入栈顶,注意:aload指令为装类实例,_0表示从局部变量的位置
1: invokespecial #1; //Method java/lang/Object."<init>":()V --invokespecial调用父类方法,使用的是栈顶对象,调用完后栈顶元素出栈,#1表示的是方法名在常量解析池中的位置
4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
--取得System类的静态成员 ,#2表示常量解析池中的第二个位置
7: ldc #3; //String TT
--新建一个String对象指向常量池中的#3,内容是TT,入栈
9: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
--调用类实例方法参数与对象都同时出栈
12: return --返回
static {};
Code:
0: iconst_5
--声明一个整形常量为5入栈,iconst_5中的i表示int,当然可以换成f的放就是float型了,const表示常量,5表示数值
1: putstatic #5; //Field tt:I
--putstatic当栈顶元素出栈放到常量解析池中的#5位置
4: return
--返回
}
//第二部分,子类 请先看静态块部分
D:\>javap -c ArrayTest
Compiled from "ArrayTest.java"
public class ArrayTest extends TT{
static int b;
int[] A;
public ArrayTest();
Code:
0: aload_0
--将局部变量0位置对象取出来,压入栈push
1: invokespecial #1; //Method TT."<init>":()V
--调用父类构造方法,并出栈pop
4: aload_0
--将将局部变量0位置对象取出来,压入栈push
5: bipush 8
--将(byte)字节8转换成int然后压入栈push
7: newarray int
--新建一个数组前面的8 pop出栈,生成的数组对象再压入栈push
9: dup
--复制当前栈顶对象,再压入栈push (此时栈里,一个类实例对象,两个数组对象)
10: iconst_0
--将整形常量0压入栈(作为数值在数组中的存放位置)push
11: iconst_1
--将整形常量1压入栈(作为存入数组中的值)push
12: iastore
--数据元素操作指令:在位置上放入刚存入的值pop 1 ;pop 0; pop 数组对象
13: dup
--再复制数组压入栈,后面的指令与9-12的一样;
14: iconst_1
15: iconst_4
16: iastore
17: dup
18: iconst_2
19: iconst_5
20: iastore
21: dup
22: iconst_3
23: bipush 12
25: iastore
26: dup
27: iconst_4
28: bipush 34
30: iastore
31: dup
32: iconst_5
33: bipush 123
35: iastore
36: dup
37: bipush 6
39: bipush 14
41: iastore
42: dup
43: bipush 7
45: bipush 32
47: iastore --此时栈里存放类实例对象,和数组实例对象.
48: putfield #2; //Field A:[I
--putfield指把栈顶对象pop,然后赋值给常量解析池中的#2位置
51: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
--取出静态成员变量push入栈,常量解析池中的#3位置
54: ldc #4; //String test
--新建一个字符串对象test入栈push
56: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/Sting;)V
--调用类实例方法,方法名在常量解析池中的#5位置,同时pop
59: return
public static void main(java.lang.String[]);
Code:
0: new #6; //class ArrayTest --新建一个ArrayTest对象, 名字在常解析池的#6位置,入栈push
3: dup
--复制当前栈顶对象,再压入栈push
4: invokespecial #7; //Method "<init>":()V --调用父类构造方法pop
7: astore_1 --将返回对象放到局部变量位置1,pop
8: iconst_2 --新建常量2入栈push
9: istore_2 --将栈顶元素保存到局部变量位置2,pop
10: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
--取出常量解析池中的#3位置的变量名,取得其静态对象入栈push
13: aload_1 --将局部变量中位置1的对象取出入栈push
14: getfield #2; //Field A:[I --取出其属性#2
17: iload_2 --取出局部变量位置2的整型数据入栈
18: iinc 2, 1 --将栈顶元素自加1再入栈
21: iaload --装栈一个数组的第几个数入栈
22: invokevirtual #8; //Method java/io/PrintStream.println:(I)V
--调用打印方法
25: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
--取出常量解析池中的#3位置的变量名,取得其静态对象入栈push
28: iload_2
--取出局部变量位置2的整型数据入栈
29: invokevirtual #8; //Method java/io/PrintStream.println:(I)V
--调用打印方法
32: return --返回
static {};
--java虚拟机把所有的静态块以及静态成员都放在一个静态块里执行了,顺序也就是在类里写定义的顺序.
Code:
0: iconst_5
--声明一个整型5压入栈顶 push
1: istore_0
--取出栈顶元素,存到局部变量位置0 pop
2: iconst_1
--声明整形变量1压入栈顶 push
3: putstatic #9; //Field b:I
--根据常量解析池位置#9 ,pop 将变量存到位置#9
6: bipush 6
--bipush将(byte)字节形转换成(int)整形,并且压入栈push
8: istore_0
--取出栈顶元素,存到局部变量位置0 pop --因为相对于第0和第1名,第6和第8句是在新的静态代码段里面的,所以用的栈也不相同
9: return
}
分享到:
相关推荐
本手册将深入解析JVM指令,特别是数值类型操作、常量推送、变量加载等操作指令。 首先,简单数值类型的指令操作主要指的是将基础的数值类型如int、long、float和double等推送到操作数栈顶。这类操作包括iconst_m1、...
首先,我们来了解下JVM指令的基本结构。每个字节码由一个单字节的操作码(opcode)和可能跟随的操作数组成。操作码决定了这条指令要执行的动作,比如加载、存储、运算、控制流程等。操作数则提供了指令执行所需的...
本篇将深入探讨JVM指令集,帮助你更好地理解Java程序的内部工作原理。 JVM指令集,也称为字节码指令集,是一系列二进制编码的指令,每个指令都对应一个特定的操作。这些指令在Java源代码被编译成.class文件时生成,...
### JVM指令手册解析 #### 一、概述 Java虚拟机(JVM)是Java语言的核心执行环境,它负责解释和执行Java字节码。为了更好地理解Java程序在JVM中的执行流程,了解JVM指令集至关重要。本文档将详细介绍《JVM指令手册》...
JVM指令集是其内部工作原理的基础,每条指令都有特定的功能,用于构建和执行Java应用程序。下面我们将深入探讨JVM指令手册中的关键概念和知识点。 1. **字节码**:Java源代码编译后生成的是字节码文件(.class),...
jvm指令码参照表,可以根据此表找到javap命令解析出来的文件进行翻译。 0x01 aconst_null null值入栈。 0x02 iconst_m1 -1(int)值入栈。 0x03 iconst_0 0(int)值入栈。 0x04 iconst_1 1(int)...
JVM指令的执行是CPU与JVM之间的交互,CPU通过解析和执行这些指令来完成Java程序的运算。了解这些指令的用法,可以帮助开发者更有效地编写和优化Java代码。例如,减少不必要的计算,利用常量池来优化内存访问,以及更...
**JVM指令详解** 在Java开发中,JVM(Java虚拟机)是执行Java程序的核心组件,它负责解析字节码并将其转换为操作系统可理解的机器指令。JVM指令是构成Java字节码的基本元素,理解这些指令有助于优化代码性能、排查...
### JVM指令集详解 #### 一、aaload:数组元素加载指令 **操作说明:** `aaload` 是一个用于从引用类型数组中加载元素到操作数栈顶的操作。 **格式:** ``` aaload ``` **指令形式:** ``` aaload = 50 (0x32) `...
在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...
《JVM指令查询手册》是Java开发者不可或缺的参考资料,它深入解析了Java虚拟机(JVM)中的各种操作指令,帮助我们理解JVM的工作机制,优化代码执行效率,解决性能问题。JVM作为Java程序运行的平台,其内部运作原理...
本手册全面解析了JVM指令,帮助开发者深入理解Java代码在运行时的内部工作原理。以下是对JVM指令的一些关键知识点的详细阐述: 1. **字节码**:Java源代码被编译成一种平台无关的二进制格式,称为字节码。这种中间...
"00-JVM指令手册.zip"包含的"00-JVM指令手册.pdf"很可能是对JVM字节码指令的详细解析,这对于深入理解Java程序的运行机制至关重要。下面将详细介绍JVM指令集及其相关知识点。 1. **JVM字节码**:Java源代码被编译成...
通过上面的示例,我们可以了解Java JVM程序指令码实例解析的过程,包括编译Java源代码、生成.class文件和反编译.class文件为JVM指令码。 在Java编程中,理解Java JVM程序指令码实例解析的过程非常重要,可以帮助...
我们将不涉及具体的压缩包内容,因为提供的信息中并未包含相关文件详情,但我们可以基于标题和描述来探讨JVM指令集的相关知识。 首先,JVM指令集是一系列预定义的、低级别的操作码,这些操作码是Java字节码的组成...
Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了平台无关的运行环境。在JVM中,内存被划分为几个不同的区域,这些区域各自有不同的功能和生命周期,以便有效地管理和执行Java程序。 1. **虚拟机栈*...
2. **验证**:接着,JVM会进行字节码验证,确保加载的类文件符合Java语言规范,没有潜在的安全问题,例如非法指令或类型不匹配。这是为了防止恶意代码破坏系统安全。 3. **准备**:在验证通过后,JVM为类的静态变量...
JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。