2012-04-05 55 views
1

第一步:我编译如下代码:为什么没有在内部类构造函数外部类对象LocalVariableTable条目(Java字节码)

public class OuterClass { 
class InnerClass{ 

    } 
} 

我有OuterClass.class和OterClass $ InnerClass.class

第2步:我使用javap来检查内部类的字节码。构造函数方法使用“1:aload_1”非常奇怪,但在LocalVariableTable中,只有一个可以通过aload_0访问的“this”条目。我假定aload_1将加载传入参数 - 这是外部类对象的引用 - 到堆栈的顶部。

我的问题:编译器为什么不为它创建一个条目(传递给构造函数的外部类的引用)?

我试过用Jsdk 1.4和openjdk 1.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; 


} 

回答

0

我认为它只是因为它并不需要在局部变量表中的条目,是永远不会需要比作为参数任何其他方式来获得所引用的论据。

1

LocalVariableTable纯粹是为了调试目的 - 它对执行没有影响。因此,它只包含源可见变量,因为这是调试器感兴趣的内容。没有理由包含编译器生成的变量。

相关问题