2015-12-18 88 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