Android getDeclaredFields()返回一个无序结果

时间:2017-07-28 01:25:14

标签: java android reflection

我宣布了这样一个类:

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,

但是在Android(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,

订单很奇怪,不是班级订单或字母顺序 我注意到Android中getDelclaredFields()的实现已更改(它的本机方法public native Field[] getDeclaredFields();)。可能无法改变行为。但我仍然想知道如何获得有序字段的结果。

1 个答案:

答案 0 :(得分:1)

如果您按特定顺序需要它们,则可以使用Arrays.sort()。在下面的示例中,您将按名称对它们进行排序(请注意,我使用lambda作为比较器):

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