Class.getDeclaredFields()是否以一致的顺序返回成员?

时间:2013-08-20 01:36:39

标签: java reflection

文档将方法描述为:

  

返回的数组中的元素没有排序,也没有任何特定的顺序

但是我不确定这是否暗示每次应用程序调用例程时订单都不一致。

我正在寻找一种方法为找到的每个字段配对一个唯一的ID - 但它也需要与下次运行应用程序时保持一致,即连续生成相同的ID。

我想迭代遍历找到的每个Field并为每个迭代的元素递增一个计数器。然后将特定元素的ID分配给计数器等于的值,但这些“ID”不一致,但是如果不按一致的顺序返回字段。

2 个答案:

答案 0 :(得分:4)

订单不需要在运行期间保持稳定。但是,字段的hashCode()值被定义为稳定(记录为始终为field.getDeclaringClass().getName().hashCode() ^ field.getName().hashCode()),因此您可以将其用作您的ID,并了解哈希代码不能保证独一无二。

或者,您可以使用适合您的任何分类标准自行对从getDeclaredFields()返回的结果进行排序。

答案 1 :(得分:3)

  

但是我不确定这是否暗示每次应用程序调用例程时订单都不一致。

它并不保证它会随着时间的推移而保持一致。但随着时间的推移可能会保持一致。

对于不同的JVM版本或供应商,行为可能会有所不同。它可能会受到意外事件的影响......比如类卸载/重新加载或JIT重新编译。

简而言之,即使你的方案出现,它也可能很脆弱。依靠无证行为是不明智的。


这也取决于“随着时间的推移”你的意思。如果您在一次运行应用程序中表示“随着时间的推移”,那么(IMO)订单将比您考虑应用程序的不同运行时更有可能是一致的。

最后,请注意使用hashcode()为您提供订购。 Hashcodes可能会发生碰撞,如果发生碰撞,您的订购将会模糊不清。碰撞的概率很小但不是零,如果您的用例与安全相关,那么对于具有该算法知识的人来说,制造碰撞并不困难。