Methods 使用反射时检索的其他字段

Methods 使用反射时检索的其他字段,methods,reflection,Methods,Reflection,我正在编写一个简单的java类,它利用反射API查找java.lang.class中声明的字段。下面是我编写的一段java代码 Field[] fields = String.class.getDeclaredFields(); for (Field f : fields) { System.out.println("Field name: " + f.getName()); } 当我运行这个程序时,我得到以下输出 Field name: serialVersionUID Field

我正在编写一个简单的java类,它利用反射API查找java.lang.class中声明的字段。下面是我编写的一段java代码

Field[] fields = String.class.getDeclaredFields();

for (Field f : fields) {
    System.out.println("Field name: " + f.getName());
}
当我运行这个程序时,我得到以下输出

Field name: serialVersionUID
Field name: CASE_INSENSITIVE_ORDER
Field name: ascii
Field name: stringArray
Field name: stringArraySize
Field name: enableCopy
Field name: value
Field name: offset
Field name: count
Field name: hashCode
Field name: hashCode32
Field name: seed
Field name: startCombiningAbove
Field name: endCombiningAbove
Field name: upperValues
Field name: serialPersistentFields
当我查看String类的源代码时,我发现API中只有6个为该类定义的字段


我无法找出这些额外字段在输出中的来源。请在此提供帮助。

您的代码没有问题;当我运行它时,我得到了预期的输出:

Field name: value
Field name: hash
Field name: serialVersionUID
Field name: serialPersistentFields
Field name: CASE_INSENSITIVE_ORDER

我猜您使用的是一个非Oracle Java虚拟机,它(在其捆绑库中或通过一些运行时魔术)向
字符串
类添加了一些非标准字段;当我运行它时,我得到了预期的输出:

Field name: value
Field name: hash
Field name: serialVersionUID
Field name: serialPersistentFields
Field name: CASE_INSENSITIVE_ORDER

我猜您使用的是一个非Oracle Java虚拟机,它(在其捆绑库中或通过一些运行时魔法)向
字符串
类添加了一些非标准字段。

在尝试检索为Java.util.HashMap类定义的字段时,我还遇到了一些奇怪的结果。它没有返回定义为瞬态(table,size)的字段。在尝试检索为java.util.HashMap类定义的字段时,我还遇到了一些奇怪的结果。它没有返回定义为瞬态(表、大小)的字段。您能告诉我们您使用的是哪个JDK和哪个版本吗?不过,我明白你的意思了。我尝试了其他几个JDK(非oracle),我可以看到您提到的区别。
java-version
给出:
java版本“1.8.0_45”
java(TM)SE运行时环境(构建1.8.0_45-b14)
java热点(TM)64位服务器虚拟机(构建25.45-b02,混合模式)
您能告诉管理员您使用的是哪个JDK和哪个版本吗?不过,我明白你的意思了。我尝试了其他几个JDK(非oracle),我可以看到您提到的区别。
java-version
给出:
java版本“1.8.0_45”
java(TM)SE运行时环境(构建1.8.0_45-b14)
java热点(TM)64位服务器虚拟机(构建25.45-b02,混合模式)