2017-07-28 4 views
0

を返す私はこのようなクラスを宣言:アンドロイドgetDeclaredFieldsは()障害の結果

public class Student implements Serializable { 

    private static final long serialVersionUID = 8010508999597447226L; 

    public long id; 
    public String name; 
    public int age; 
    public String phone; 
    public String address; 

    public static void main(String[] args) { 
     Field[] fields = Student.class.getFields(); 
     System.out.println("getFields(): " + fields2String(fields)); 
     fields = Student.class.getDeclaredFields(); 
     System.out.println("getDeclaredFields(): " + fields2String(fields)); 
    } 

    private static String fields2String(Field[] fields) { 
     if (fields != null) { 
      StringBuilder sb = new StringBuilder(); 
      for (Field f : fields) { 
       sb.append(f.getName()); 
       sb.append(","); 
      } 
      return sb.toString(); 
     } 
     return null; 
    } 
} 

メイン実行結果は次のとおりです(順序は、私の期待順序私Student.javaに同じである)

getFields(): id,name,age,phone,address, 
getDeclaredFields(): serialVersionUID,id,name,age,phone,address, 

しかし、アンドロイド(4.1.2のDalvik JVM)上で動作している同じコードが、結果はフィールドの順序は次のとおり

07-28 09:54:14.271 5972-5972/com.ex I/System.out: getFields(): address,age,id,name,phone, 
07-28 09:54:14.271 5972-5972/com.ex I/System.out: getDeclaredFields(): serialVersionUID,address,phone,name,age,id, 

順序はストラングありますe、クラスの順序やアルファベット順ではありません getDelclaredFields()の実装がAndroidで変更されていることに気づきました(これはネイティブメソッド​​です)。動作を変更することは不可能かもしれません。しかし、私はまだ順序フィールドを得る方法を知りたい。

+0

フィールドはクラスで宣言される順序は正しさとは無関係であるべきそのクラスまたは他のクラスのコードのあなたがコミュニティと共有したい/共有できる場合、あなたのユースケースIDについて本当に興味がありますか? –

+2

このメソッドのJavadocは、戻り値が特定の方法でソートまたは順序付けされないことを指定します。これはAndroidとは関係ありません。異なるJVMを使用したり、現在のものを更新したりすると、PC上の順序が変わることがあります。 –

+0

問題をアップデートして、完全なJavaソースと出力を追加しました。 –

答えて

1

特定の順序で必要な場合は、Arrays.sort()を使用できます。例では、あなたは彼らが(私はコンパレータとしてラムダを使用していますことに注意してください)名前で並べ替えになるだろう下回っ:

Arrays.sort(getClass().getDeclaredFields(), (a, b) -> a.getName().compareTo(b.getName()));

+0

私は自分の問題を編集しました。私は.java宣言された順序が欲しいです。 –

+0

文書によれば、それを持つことはできません。これを行う唯一の方法は、ソースコードの解析です。私はまだこれについてのユースケースを考えることができません... –

+0

また、整数を受け取り、手動で各フィールドに異なる数字を追加するアノテーションを作成する類似のことを行うことができます。しかし、私は@Totòに同意する、私はそれが必要な正当な理由を考えることができません。あなたの問題は、リフレクションの制限ではなく、アプリケーションのアーキテクチャ上にある可能性があります。 – Fabio