http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getDeclaredFields()から:
public Field[] getDeclaredFields() は SecurityException をスローします
この Class オブジェクトによって表されるクラスまたはインターフェイスによって宣言されたすべてのフィールドを反映する Field オブジェクトの配列を返します。これには、パブリック、保護、デフォルト (パッケージ) アクセス、およびプライベート フィールドが含まれますが、継承されたフィールドは除外されます。返される配列の要素はソートされておらず、特定の順序でもありません。クラスまたはインターフェイスがフィールドを宣言しない場合、またはこの 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 のランタイム リフレクションはスレッド セーフではなく、一般に本番環境に対応しているとは見なされないことに注意してください。
おそらく依存関係を別の方法でエンコードすることにより、順序に依存しないように設計を変更することで、より良いサービスが提供されると私はまだ感じています。