2013-07-01 17 views
10

最近、私はJavaのリフレクションと.classフォーマットで遊んでいます。私は現在ldc命令を勉強しています。Javaでのシンボリックリファレンス

JVM仕様で私は理解できない用語を見つけました:シンボリックリファレンス、私は以下の質問があります。

  1. この意味は?

  2. どこで使用されますか?

  3. ldc命令でシンボリックリファレンスをロードするケースはありますか?
  4. そのアクションに対応するJavaのコードはありますか?

答えて

16

問題を引き起こしているドキュメントの正確な部分を引用すると便利です。実行時定数プールエントリはAへのシンボリック参照 であれば、そうでない場合

:あなたが持っていないので、私はldcためのドキュメントから、あなたが引用されているかもしれないもので推測を取るつもりですクラス(value)を表すClassオブジェクトへの参照がオペランドスタックにプッシュされた である場合、指定されたクラスが解決され(§5.4.3.1)、そのクラスを表すClassオブジェクトへの参照が です。

それ以外の場合は、実行時定数プールエントリは、メソッドタイプまたはメソッドハンドル(5.1節)への参照 のシンボリックでなければなりません。

ランタイムデータ構造の多くを提供しています:...

この引用は、実行時定数プールを説明JVM仕様(5.1)の別のセクションへのリンクを持っていますテキスト値として:これが何を意味するのか、従来のプログラミング言語の実装

の シンボルテーブルの目的は、実行時定数プールはシンボル形式でクラスの作品についての情報が含まれていることです。

したがって、ldcにクラスへの「シンボリックリファレンス」が与えられると、定数プール内のCONSTANT_Class_info構造体のインデックスが与えられます。この構造の定義を見ると、クラスの名前への参照が含まれていることがわかります。クラスの名前も定数プール内に保持されています。

TL; DR:「シンボリックリファレンス」は、実際のオブジェクトを取得するために使用できる文字列です。


例:

if (obj.getClass() == String.class) { 
    // do something 
} 

は、次のバイトコードのようになる。

aload_1 
invokevirtual #21; //Method java/lang/Object.getClass:()Ljava/lang/Class; 
ldc  #25; //class java/lang/String 
if_acmpne  20 

この場合、ldc動作を象徴格納されているクラスを指します。JVMがこのオペコードを実行すると、シンボリックリファレンスを使用して現在のクラスローダー内の実際のクラスを識別し、クラスインスタンスへの参照を返します。

+0

いつ使用されますか?いつそのようなことが必要ですか? – user35443

+0

@ user35443 - 明示的なメモリアドレスではなく、名前を持つ変数を使用してコードを記述するのと同じ理由から。 – parsifal

+0

シンボリックリンクで 'ldc'命令を使用するJavaコードの例がありますか?これを使用する必要があるとは想像もできません。 – user35443

関連する問題