2015-12-18 149 views
-5

我正在使用ASM-5讀取類文件並生成UML圖的項目。我在測試中遇到了問題,看看我們是否正確閱讀。我正在測試這個String類。文檔中顯示的唯一字段是CASE_INSENSITIVE_ORDER。這似乎很腥,但我寫了我的測試,以檢查該字段是否僅讀取了該字段,並且出現了5個字段:value:char [],hash:int,serialVersionUID:long,serialPersistentField:ObjectStreamField和CASE_INSENSITIVE_ORDER:比較。java有什麼私人領域?

這4個額外字段來自哪裏,爲什麼他們不在oracle文檔中?當我嘗試使用反射來查看字符串類的字段時(我只能看到CASE_INSENSITIVE_ORDER),我也無法訪問它們。這似乎是應該更好記錄的東西。

+7

爲什麼'private'字段在文檔中?它們是實現細節,不是API的一部分。 –

+0

文檔是關於如何使用課程的,因此您不需要在其中包含專用字段。如果你想知道實現細節,你可以看看[代碼](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/ String.java?av=f)。 – azurefrog

+0

另見:[Encapsulation](https://en.wikipedia.org/wiki/Encapsulation_(computer_programming))。 – Powerlord

回答

0

在Java 8(它在其它版本不同),String具有以下字段(排列爲您提供方便):

public static final Comparator<String> CASE_INSENSITIVE_ORDER; 
private static final ObjectStreamField[] serialPersistentFields; 
private static final long    serialVersionUID; 

private  int hash; 
private final char[] value; 

正如你所看到的,只是其中之一是public,其中3是static

根據您希望顯示的UML圖表,您還需要查找private字段,並且您可能需要排除static字段。

其實,良好的編程習慣意味着你永遠不會找到一個public,非static字段。

+0

這些變量中:兩個靜態變量用於序列化。其中一個靜態變量是'.equalsIgnoreCase'的比較器。其中一個變量是'.getHashCode'的哈希碼。其中一個變量是實際String的後備數組。 – Powerlord