2012-04-05 11 views
1

ステップ1:私は次のコードをコンパイル:がないのはなぜ内部クラスのコンストラクタで外部クラスのオブジェクトのLocalVariableTableのエントリ(Javaのバイトコード)

public class OuterClass { 
class InnerClass{ 

    } 
} 

私はOuterClass.classを持っているのとOterClass $ InnerClass.class

ステップ2:javapを使用して、内部クラスのバイトコードをチェックします。コンストラクタメソッドが "1:aload_1"を使用するのは非常に奇妙ですが、LocalVariableTableではaload_0がアクセスできる "this"のエントリは1つだけです。 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は、まさにデバッグ用です。実行には影響ありません。したがって、デバッガが関心を持っているのはソース可視変数のみです。コンパイラ生成変数を含める理由はありません。

関連する問題