2013-07-01 72 views
10

在這些日子裏,我一直在玩Java反射和.class格式。我目前正在學習ldc指令。Java中的符號引用

在JVM規範中我發現的術語我不明白:符號引用,我有以下問題。

  1. 這是什麼意思?

  2. 它在哪裏使用?

  3. 在哪些情況下ldc指令加載符號引用?
  4. Java中是否存在與該操作對應的任何代碼?

回答

16

如果你想引用那些給你帶來麻煩的確切文檔,這將是有幫助的。既然你沒有,我要以此來猜測你可能已經引述,從文檔的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執行這個操作碼時,它將使用符號引用來標識當前類加載器中的實際類,並返回對類實例的引用。

+0

什麼時候使用?什麼時候需要這樣的東西? – user35443

+0

@ user35443 - 出於與使用具有名稱的變量編寫代碼相同的原因,而不是顯式內存地址。 – parsifal

+0

您是否有一些Java代碼示例,其中'ldc'指令與符號鏈接一起使用?我無法想象必須使用這種情況。 – user35443