出处:从一个class文件深入理解Java字节码结构
通过文章自己实践的
java源代码:
package hello;
public class Demo {
private int num=1;
public int add() {
num=num+2;
return num;
}
}
class文件存在了:F:\java\workspace\hello\src\hello
之所以要进到src进行编译,是考虑到后面反编译时生成class类型对象方便
F:\>cd java
F:\java>cd workspace
F:\java\workspace>cd hello
F:\java\workspace\hello>cd src
F:\java\workspace\hello\src>javac hello/Demo.java
F:\java\workspace\hello\src>javap -verbose Demo.class
错误: 找不到类: Demo.class
F:\java\workspace\hello\src>cd hello
F:\java\workspace\hello\src\hello>javap -verbose Demo.class
Classfile /F:/java/workspace/hello/src/hello/Demo.class
Last modified 2020-3-9; size 294 bytes
MD5 checksum fde1585395e8356cc4fa817516b91ec8
Compiled from "Demo.java"
public class hello.Demo
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #4.#15 // java/lang/Object."<init>":()V
#2 = Fieldref #3.#16 // hello/Demo.num:I
#3 = Class #17 // hello/Demo
#4 = Class #18 // java/lang/Object
#5 = Utf8 num
#6 = Utf8 I
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 add
#12 = Utf8 ()I
#13 = Utf8 SourceFile
#14 = Utf8 Demo.java
#15 = NameAndType #7:#8 // "<init>":()V
#16 = NameAndType #5:#6 // num:I
#17 = Utf8 hello/Demo
#18 = Utf8 java/lang/Object
{
public hello.Demo();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #2 // Field num:I
9: return
LineNumberTable:
line 3: 0
line 4: 4
public int add();
descriptor: ()I
flags: ACC_PUBLIC
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: aload_0
2: getfield #2 // Field num:I
5: iconst_2
6: iadd
7: putfield #2 // Field num:I
10: aload_0
11: getfield #2 // Field num:I
14: ireturn
LineNumberTable:
line 7: 0
line 8: 10
}
SourceFile: "Demo.java"
F:\java\workspace\hello\src\hello>