为什么不是';内部类构造函数(Java字节码)中的外部类对象在LocalVariableTable中没有条目
步骤1:我编译了以下代码:为什么不是';内部类构造函数(Java字节码)中的外部类对象在LocalVariableTable中没有条目,java,compiler-construction,jvm,bytecode,inner-classes,Java,Compiler Construction,Jvm,Bytecode,Inner Classes,步骤1:我编译了以下代码: public class OuterClass { class InnerClass{ } } 我有OuterClass.class和OterClass$InnerClass.class 步骤2:我使用javap检查内部类的字节码。非常奇怪的是,构造函数方法使用“1:aload_1”,但在LocalVariableTable中,aload_0只能访问“this”的一个条目。我假设aload_1将传入参数(外部类对象的引用)加载到堆栈顶部 我的问题:为什
public class OuterClass {
class InnerClass{
}
}
我有OuterClass.class和OterClass$InnerClass.class
步骤2:我使用javap检查内部类的字节码。非常奇怪的是,构造函数方法使用“1:aload_1”,但在LocalVariableTable中,aload_0只能访问“this”的一个条目。我假设aload_1将传入参数(外部类对象的引用)加载到堆栈顶部
我的问题:为什么编译器不为它创建一个条目(传递给构造函数的外部类的引用)
我尝试了JSDK1.4和OpenJDK1.6
~$ javap -v -c OuterClass\$InnerClass
Compiled from "OuterClass.java"
class OuterClass$InnerClass extends java.lang.Object
SourceFile: "OuterClass.java"
InnerClass:
#24= #1 of #22; //InnerClass=class OuterClass$InnerClass of class OuterClass
minor version: 0
major version: 50
Constant pool:
const #1 = class #2; // OuterClass$InnerClass
const #2 = Asciz OuterClass$InnerClass;
const #3 = class #4; // java/lang/Object
const #4 = Asciz java/lang/Object;
const #5 = Asciz this$0;
const #6 = Asciz LOuterClass;;
const #7 = Asciz <init>;
const #8 = Asciz (LOuterClass;)V;
const #9 = Asciz Code;
const #10 = Field #1.#11; // OuterClass$InnerClass.this$0:LOuterClass;
const #11 = NameAndType #5:#6;// this$0:LOuterClass;
const #12 = Method #3.#13; // java/lang/Object."<init>":()V
const #13 = NameAndType #7:#14;// "<init>":()V
const #14 = Asciz ()V;
const #15 = Asciz LineNumberTable;
const #16 = Asciz LocalVariableTable;
const #17 = Asciz this;
const #18 = Asciz LOuterClass$InnerClass;;
const #19 = Asciz SourceFile;
const #20 = Asciz OuterClass.java;
const #21 = Asciz InnerClasses;
const #22 = class #23; // OuterClass
const #23 = Asciz OuterClass;
const #24 = Asciz InnerClass;
{
final OuterClass this$0;
OuterClass$InnerClass(OuterClass);
Code:
Stack=2, Locals=2, Args_size=2
0: aload_0
1: aload_1
2: putfield #10; //Field this$0:LOuterClass;
5: aload_0
6: invokespecial #12; //Method java/lang/Object."<init>":()V
9: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this LOuterClass$InnerClass;
}
~$javap-v-c OuterClass\$InnerClass
从“OuterClass.java”编译而来
类OuterClass$InnerClass扩展了java.lang.Object
源文件:“OuterClass.java”
内部类:
#24=#22中的#1//InnerClass=类OuterClass$类OuterClass的InnerClass
次要版本:0
主要版本:50
固定池:
常数#1=类#2;//OuterClass$InnerClass
const#2=Asciz外部类$InnerClass;
常数#3=类#4;//java/lang/Object
const#4=Asciz java/lang/Object;
const#5=此$0;
常数#6=Asciz LOuterClass;;
常数7=Asciz;
常数8=Asciz(LOuterClass;)V;
常数#9=Asciz代码;
常数#10=字段#1.#11;//OuterClass$InnerClass。此$0:LOuterClass;
常数#11=名称和类型#5:#6;//这个$0:LOuterClass;
常数#12=方法#3.#13;//java/lang/Object。“:()V
常数#13=名称和类型#7:#14;//“”:()V
常数#14=Asciz()V;
常数#15=Asciz LineNumberTable;
const#16=Asciz LocalVariableTable;
const#17=Asciz this;
const#18=Asciz LOuterClass$InnerClass;;
const#19=Asciz源文件;
const#20=Asciz OuterClass.java;
const#21=Asciz内部类;
常数22=类23;//外层
const#23=Asciz外部通道;
const#24=Asciz内部类;
{
最终外螺纹为0美元;
OuterClass$InnerClass(OuterClass);
代码:
堆栈=2,局部变量=2,参数大小=2
0:aload_0
1:aload_1
2:putfield#10;//这个$0:LOuterClass字段;
5:aload_0
6:invokespecial#12;//方法java/lang/Object。“:()V
9:返回
LineNumberTable:
第3行:0
LocalVariableTable:
起始长度插槽名称签名
0 10 0此LOuterClass$InnerClass;
}
我认为这只是因为它不需要局部变量表中的一个条目,作为一个参数,它永远不需要以任何其他方式被引用。我认为这只是因为它不需要局部变量表中的一个条目,作为一个参数,除了作为一个参数外,不需要以任何其他方式引用。本地变量表纯粹用于调试目的,对执行没有影响。因此,它只包含源可见变量,因为调试器感兴趣的是源可见变量。没有理由包含编译器生成的变量。本地变量表纯粹用于调试目的-它对执行没有影响。因此,它只包含源可见变量,因为调试器感兴趣的是源可见变量。没有理由包含编译器生成的变量