[解決済み] Javaにおけるシンボリック参照
質問
ここ数日、Javaのリフレクションで遊んでいて
.class
形式を使用します。現在、私は
ldc
を指示します。
JVM仕様書の中に、理解できない用語がありました。 シンボリックリファレンス また、以下のような疑問があります。
-
どういう意味ですか?
-
どこで使われているのですか?
-
どのような場合に
ldc
命令は、シンボリックリファレンスをロードしますか? - その動作に対応する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がこのオペコードを実行するとき、現在のクラスローダー内で実際のクラスを識別するためにシンボリックリファレンスを使用し、クラスインスタンスへの参照を返します。
関連
-
[解決済み] 警告: コンテキスト初期化中に例外が発生 - 更新の試みはキャンセルされました。
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JVMフラグCMSClassUnloadingEnabledは、実際に何をするのですか?
-
[解決済み] XX:MaxDirectMemorySizeの既定値
-
[解決済み] Java Swingで複数のボタンに対して複数のActionListenersを追加する方法
-
[解決済み] Javaでのスキャナが動作しない
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] Apache Camelのログに簡単なテキストを記録する
-
[解決済み] アニメーションGIFの表示
-
[解決済み] 文字列が一意な文字であるかどうかを判定する
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] java.lang.ClassCastException: java.lang.Long を java.lang.Integer にキャストできない(java 1.6