先写一个Otter类
public class Otter {
int outerField = 0;
class Inner{
void InnerMethod(){
int i = outerField;
}
}
}
进入该类目录,通过javac Otter.java 编译得到Otter.class和Otter$Inner.class
然后通过javap -classpath . -v Otter.$Inner(其中.表示当前目录下寻找class文件,-v为-verbose输出信息较多)得到反编译文件:
Compiled from "Otter.java"
public class com.example.xiahangli.memoryleakeage.Otter extends java.lang.Object
SourceFile: "Otter.java"
InnerClass:
#6= #5 of #3; //Inner=class com/example/xiahangli/memoryleakeage/Otter$Inner of class com/example/xiahangli/memoryleakeage/Otter
minor version: 0
major version: 50
Constant pool:
const #1 = Method #4.#16; // java/lang/Object."<init>":()V
const #2 = Field #3.#17; // com/example/xiahangli/memoryleakeage/Otter.outerField:I
const #3 = class #18; // com/example/xiahangli/memoryleakeage/Otter
const #4 = class #19; // java/lang/Object
const #5 = class #20; // com/example/xiahangli/memoryleakeage/Otter$Inner
const #6 = Asciz Inner;
const #7 = Asciz InnerClasses;
const #8 = Asciz outerField;
const #9 = Asciz I;
const #10 = Asciz <init>;
const #11 = Asciz ()V;
const #12 = Asciz Code;
const #13 = Asciz LineNumberTable;
const #14 = Asciz SourceFile;
const #15 = Asciz Otter.java;
const #16 = NameAndType #10:#11;// "<init>":()V
const #17 = NameAndType #8:#9;// outerField:I
const #18 = Asciz com/example/xiahangli/memoryleakeage/Otter;
const #19 = Asciz java/lang/Object;
const #20 = Asciz com/example/xiahangli/memoryleakeage/Otter$Inner;
{
int outerField;
public com.example.xiahangli.memoryleakeage.Otter();
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_0
6: putfield #2; //Field outerField:I
9: return
LineNumberTable:
line 6: 0
line 7: 4
line 9: 9
}
忽略一些常量池信息,分析内部类文件
其中:
这里写代码片