2012-08-23 55 views

回答

5

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版, 中定義的構造函數的描述符 ,後跟$,然後是簡單類型變量的名稱。

所以可以這樣說,俗稱命名方案完全標準化的,我們可以依靠它(因爲必須依靠所有的類加載器找到所需的類文件)。

+0

謝謝,沒有看到。這些文件(我的意思是JLS)太長了。爲了完整起見,可以在這裏找到規範的文本(http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.1)。 –

+0

我知道。我放棄了閱讀它們,並直接在實現中查看規範的提示(我曾經爲了一個特定的功能而不得不爲特定的類加載器尋找內部類) –

0

我相信命名方案沒有在正式意義上指定,因爲它是(據說)一個實現細節。

+3

但是這可能會導致JVM的不同實現不兼容。這不符合»一次寫入,在任何地方都可以寫入「非常好」。 – Joey