2017-07-04 96 views

回答

2

根本沒有必要擁有Java源代碼文件。

只有兩個相關屬性。

  1. SourceFile類屬性指定的源代碼文件,其不必須是.java文件的名稱。

  2. LineNumberTable屬性應用於Code屬性,告訴字節碼指令如何映射到源代碼行。

堆棧跟蹤只報告類和方法名稱以及由上述兩個屬性報告的源文件名和行號。它背後沒有額外的語義。

這些屬性已經足夠執行步驟調試,因爲調試器只需要加載指定的文件(假設它是基於文本的)並突出顯示特定的行。我已經通過這種方式跨過了一個XSLT文件,它已經被XSLT處理器動態編譯爲字節碼。如果你想讓局部變量可檢查,你還必須添加一個LocalVariableTable屬性到代碼中。

我也用它們的方式,你打算,已經生成代碼的元信息指向觸發代碼生成的原始代碼。它甚至發生在編譯普通Java源代碼時,因爲爲lambda表達式生成的合成方法在定義它的源代碼級別方法中具有指向lambda表達式的行號表。

+1

難道一個類文件可以由多於一個SourceFile組成嗎? 在Mixin庫中,正在通過變換器在類加載時添加和替換方法。 –

+1

那麼,只有一個'SourceFile'屬性,所以你只能指向一個源文件。您通常使用委託來解決這個問題,只有非常小的注入代碼,這些代碼會調用其他類文件中的代碼,這些代碼也可以指向調試信息中的不同源文件。 – Holger

+0

有點煩人,堆棧跟蹤不尊重https://jcp.org/en/jsr/detail?id=45 –