在這些日子裏,我一直在玩Java反射和.class
格式。我目前正在學習ldc
指令。Java中的符號引用
在JVM規範中我發現的術語我不明白:符號引用,我有以下問題。
這是什麼意思?
它在哪裏使用?
- 在哪些情況下
ldc
指令加載符號引用? - Java中是否存在與該操作對應的任何代碼?
在這些日子裏,我一直在玩Java反射和.class
格式。我目前正在學習ldc
指令。Java中的符號引用
在JVM規範中我發現的術語我不明白:符號引用,我有以下問題。
這是什麼意思?
它在哪裏使用?
ldc
指令加載符號引用?如果你想引用那些給你帶來麻煩的確切文檔,這將是有幫助的。既然你沒有,我要以此來猜測你可能已經引述,從文檔的ldc:
否則,如果運行時間常量池項是一個象徵性的參考 到類(§5.1),那麼指定的類將被解析(§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執行這個操作碼時,它將使用符號引用來標識當前類加載器中的實際類,並返回對類實例的引用。
什麼時候使用?什麼時候需要這樣的東西? – user35443
@ user35443 - 出於與使用具有名稱的變量編寫代碼相同的原因,而不是顯式內存地址。 – parsifal
您是否有一些Java代碼示例,其中'ldc'指令與符號鏈接一起使用?我無法想象必須使用這種情況。 – user35443