从http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getDeclaredFields():
public Field[] getDeclaredFields() 抛出 SecurityException
返回一个 Field 对象数组,反映由此 Class 对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类或接口未声明任何字段,或者此 Class 对象表示原始类型、数组类或 void,则此方法返回长度为 0 的数组。请参阅 Java 语言规范,第 8.2 和 8.3 节。
(我的重点)。类似的语言在 getDeclaredMethods() 的文档中是明确的,但在 getDeclaredClasses() 的文档中没有(但 IMO 可以被认为是隐含的)。
所以不,您不能依赖 JVM 上的 Java 反射进行排序;在实践中,我看到顺序会根据正在运行的 JVM 的架构(32 位与 64 位)而有所不同。
如果您确实必须按特定顺序初始化对象(为什么?),您可以使用命名约定并手动排序;但是,最好将代码更改为与顺序无关。
更新
看来您可以从 Scala 反射 API 中获得一些东西:
trait EarlyInit {
val mirror = runtimeMirror(this.getClass.getClassLoader)
val reflection = mirror.reflect(this)
mirror
.classSymbol(this.getClass)
.toType
.members
.sorted /// This method is documented to return members "in declaration order"
.filter(_.isModule)
.foreach(m => reflection.reflectModule(m.asModule).instance)
}
}
请参阅API 文档:
对包含在此范围内的符号进行排序,以便: 1) 符号以其所有者的线性化顺序出现。2) 具有相同所有者的符号按其声明的相同顺序出现。3) 综合成员(例如 vals/vars 的 getter/setter)可能以任意顺序出现。
但是,这并不能保证在一般情况下有效,特别是对于混合 Java/Scala 项目(因为确实没有办法按声明顺序获取 Java 类的成员)。另外,请注意 Scala 运行时反射不是线程安全的,通常不被认为是生产就绪的。
我仍然认为通过将设计修改为与订单无关,可能通过对依赖项进行不同的编码来更好地为您服务。