對this question建議最多的答案建議在特定文件夾中搜索具有特定名稱的類文件,作爲反映匿名內部類的解決方法。哪個文檔(如果有)是指定的Java類文件的名稱和位置?定義的.class文件的名稱和位置在哪裏?
VM-spec包含對類文件格式的詳細說明,但似乎沒有關於應該如何命名以及它們應該存儲在何處的規範。同樣,language-spec似乎沒有涉及這個問題。
對this question建議最多的答案建議在特定文件夾中搜索具有特定名稱的類文件,作爲反映匿名內部類的解決方法。哪個文檔(如果有)是指定的Java類文件的名稱和位置?定義的.class文件的名稱和位置在哪裏?
VM-spec包含對類文件格式的詳細說明,但似乎沒有關於應該如何命名以及它們應該存儲在何處的規範。同樣,language-spec似乎沒有涉及這個問題。
從Class class (getSimpleName method)的源代碼:
1137 // According to JLS3 "Binary Compatibility" (13.1) the binary
1138 // name of non-package classes (not top level) is the binary
1139 // name of the immediately enclosing class followed by a '$' followed by:
1140 // (for nested and inner classes): the simple name.
1141 // (for local classes): 1 or more digits followed by the simple name.
1142 // (for anonymous classes): 1 or more digits.
所提到的文件:JLS3 "Binary Compatibility" (13.1)指出它是這樣的(更精確,但更少簡明):
此外,所得的類文件必須有某些屬性。 A 特別選擇了這些屬性的數量以支持源代碼轉換,以保持二進制兼容性。所需 屬性是:
的類或接口必須由其二進制名稱來命名,它們必須 滿足以下約束條件:
頂級類型的二進制名稱(第7.6節)是它的規範名稱 (第6.7節)。
成員類型(§8.5,§9.5)的二進制名稱由其即時封閉類型的二進制 名稱組成,後跟$,後面跟着成員的簡單名稱 。
局部類(§14.3)的二進制名稱由二進制名稱其直接封閉類型,其次是$,隨後的數字的 非空序列,隨後由本地的簡單名稱的 的 類。
匿名類(§15.9.5)的二進制名稱包括它的直接封閉類型,其次是$,隨後的數字的 非空序列的二進制 名的。
由通用類或 接口聲明的類型可變的二進制名稱(§8.1.2,§9.1.2)是它的立即 封閉類型,隨後$的二進制名稱,然後是簡單的名稱類型爲 變量。
由通用方法 (§8.4.4)是類型聲明的方法的二進制名稱,聲明的類型可變的二進制名後跟$ ,隨後該方法的描述符中所定義的Java™ 虛擬機規範,Java SE 7 Edition,隨後是$, ,後跟簡單名稱的類型變量。
由泛型構造函數 (第8.8節)聲明的類型變量的二進制名稱。4)是聲明構造函數的類型的二進制名稱, 後跟$,後面是在Java™虛擬機規範,Java SE 7版, 中定義的構造函數的描述符 ,後跟$,然後是簡單類型變量的名稱。
所以可以這樣說,俗稱命名方案是完全標準化的,我們可以依靠它(因爲必須依靠所有的類加載器找到所需的類文件)。
謝謝,沒有看到。這些文件(我的意思是JLS)太長了。爲了完整起見,可以在這裏找到規範的文本(http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.1)。 –
我知道。我放棄了閱讀它們,並直接在實現中查看規範的提示(我曾經爲了一個特定的功能而不得不爲特定的類加載器尋找內部類) –