2011-12-17 17 views
4

私はこのバイトコードを持っている:これは継続ですバイトコードでは、getstaticはどういう意味ですか?

new     java.lang.Object 
// stack is [newObjectRef] 
dup 
// Stack is [newObjectRef newObjectRef] 
invokespecial  void java.lang.Object.<init>() 
// Stack is [initializedAsTypeObjectObjectRef] 
putstatic   java.lang.Object class.a 
// variable a has the reference of new object 
getstatic   java.io.PrintStream java.lang.System.out 
// Take the static value of System.out 
// Stack is [initializedAsTypeObjectObjectRef System.out] 

更新:

> ldc     "test" // Stack is 
> [initializedAsTypeObjectObjectRef System.out "test"] 
> jsr     pos.0000026C // call a subrutine invokevirtual  void 
> java.io.PrintStream.println(java.lang.String) // actually print the 
> result // stack is (I think) Empty at this time ? 

は翻訳があるん:

Object a = new Object(); 
    a = "test"; 
    System.out.print(a); 

は私のスタックは良いですか?

私はout()をよく理解していません。 おそらく私はoutter()とprint()の後に使用する必要がありますか?

私はいつも習慣的に印刷するには()を使用し

..

+0

getstatic負荷スタック上の静的クラス変数の値を使用することになりますので、System.outは、システムのstatic分野です。あなたは何を知りたいですか? – yonexbat

+0

私のオペランドスタックは実際には良いですか? –

答えて

3

私はコード

public static void main(String[] args) { 
    Object a; 
    a = "test"; 
    System.out.println(a); 
} 

をコンパイルし、

javap -c Main 

を実行した場合、私は

public static void main(java.lang.String[]); 
Code: 
    0: ldc   #2     // String test 
    2: astore_1  
    3: getstatic  #3     // Field java/lang/System.out:Ljava/io/PrintStream; 
    6: aload_1  
    7: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/Object;)V 
    10: return  

を参照してくださいますそれを見ることができますgetstaticの負荷フィールドSystem.out


は、オブジェクトはので、私はあなたがあなたが信じているコードを見ているとは思わないout()と呼ばれるmethodを持っていません。

getstaticは、staticフィールドを取得します。あなたは

System.out.println(); 

を書く場合、これはgetstatic

+0

あなたの書き込みは、System.outオブジェクト用です。 オブジェクトを取得しますが、実際には印刷されませんか? –

+0

私は継続を更新します。そうですか? –

+0

私は '= new Object();'を冗長で混乱させるので取り除きます。 –

関連する問題