因此,這裏的例子:什麼做「開始」和LocalVariableTable「長度」屬性意味着
LocalVariableTable:
Start Length Slot Name Signature
0 133 0 this Lcom/my/class/Test;
2 131 1 a I
4 129 2 b I
7 126 3 i I
10 123 4 i2 I
16 117 5 o1 Ljava/lang/Integer;
31 102 6 o2 Ljava/lang/Integer;
什麼是啓動和長度是什麼意思?爲什麼長度有它的價值?爲什麼相同類型(整數)的長度不同?爲什麼長度可以改變,當我添加一些東西給類並重新編譯它而不觸及特定的局部變量?
非常感謝您的回答。如果你不介意,我想根據你的回答提出另一個問題。如果你說LVT是可選的,它的目的只是用於調試,那麼如何將以局部變量索引作爲參數(例如,aload)的java操作碼正在工作呢?當沒有LVT時,局部變量信息是否存儲在其他地方? – dhblah
「this」(對於非靜態方法)和方法參數(每個「long」/「double」2個槽,其他類型爲1個槽)將自動使用第一個槽,這可以通過方法簽名來決定。在那之後,如果JVM看到一個用於新插槽的存儲指令,它就簡單地分配這個插槽(或者'lstore' /'dstore'的兩個插槽),並根據操作碼設置其類型。在已驗證的字節碼中,不應該有從未知時隙加載的加載指令(不是由方法參數或先前的存儲指令佔用)。 –
所以基本上你會說,雖然LVT可以在編譯時被丟棄,但它僅用於信息目的。並且所有與JVM所需的局部變量相關的數據都存儲在堆棧幀中的局部變量數組中。因此,本地變量可以通過它們在該數組中的索引來尋址,而LVT僅包含補充信息,以便在調試期間在調試窗格的正確步驟中顯示\隱藏本地變量。 – dhblah