【问题标题】:Does Class.getDeclaredFields() return members in a consistent order?Class.getDeclaredFields() 是否以一致的顺序返回成员?
【发布时间】:2013-08-21 22:48:24
【问题描述】:

文档将方法描述为:

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

但是我不确定这是否意味着每次应用程序调用例程时顺序都不一致。

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

我只想遍历找到的每个字段,并为每个迭代的元素增加一个计数器。然后将特定元素的 ID 分配给计数器等于的任何值,尽管如果字段没有以一致的顺序返回,这些 'id' 是不一致的。

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    顺序不需要在运行中保持稳定。但是,该字段的 hashCode() 值被定义为稳定(记录为始终为 field.getDeclaringClass().getName().hashCode() ^ field.getName().hashCode()),因此您可以将其用作您的 ID,但要了解哈希码不能保证是唯一的。

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

    【讨论】:

    • 感谢您的直接答复。我想我要在树形图中按名称对字段进行排序,然后应用我上面提到的相同算法来获取 ID(每次迭代递增)
    • @Jeremy 不要使用TreeMap。只需使用Arrays.sort
    【解决方案2】:

    但是我不确定这是否意味着每次应用程序调用例程时顺序都不一致。

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

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

    简而言之,即使您的方案看起来有效,它也很容易变得脆弱。依赖无证行为是不明智的。


    这还取决于您所说的“随着时间的推移”是什么意思。如果您的意思是在应用程序的一次运行中“随着时间的推移”,那么与您考虑应用程序的不同运行相比,(IMO)更有可能保持顺序一致。

    最后,谨防使用hashcode() 给您下订单。哈希码可能会发生冲突,如果发生冲突,您的排序将不明确。碰撞的概率很小但不是零,如果您的用例与安全相关,那么了解算法的人制造碰撞并不难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2021-12-08
      • 2015-01-05
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多