1. ホーム
  2. java

[解決済み] Javaにおけるシンボリック参照

2022-02-25 15:39:52

質問

ここ数日、Javaのリフレクションで遊んでいて .class 形式を使用します。現在、私は ldc を指示します。

JVM仕様書の中に、理解できない用語がありました。 シンボリックリファレンス また、以下のような疑問があります。

  1. どういう意味ですか?

  2. どこで使われているのですか?

  3. どのような場合に ldc 命令は、シンボリックリファレンスをロードしますか?
  4. その動作に対応するJavaのコードはありますか?

解決方法は?

問題を起こしているドキュメントの一部を正確に引用していただけると助かります。引用されていないので、あなたが引用した可能性のあるドキュメントを推測してみます。 ldc :

そうでない場合、ランタイム定数プールのエントリーがシンボリック参照であれば という名前のクラスが解決され (5.4.3.1節) そのクラスを表すClassオブジェクトへの参照(value)が生成されます。 をオペランドスタックにプッシュする。

そうでない場合は、ランタイム定数プールのエントリーは、シンボリックな メソッドタイプまたはメソッドハンドルへの参照(§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がこのオペコードを実行するとき、現在のクラスローダー内で実際のクラスを識別するためにシンボリックリファレンスを使用し、クラスインスタンスへの参照を返します。