Class.getFields()返回的字段顺序

时间:2011-03-04 16:28:57

标签: java reflection

Class.getFields()的Javadoc说:“返回的数组中的元素没有排序,也没有按任何特定的顺序排列。”

有关如何确定订单的任何提示?有可能当我执行两次这个方法时,我得到不同顺序的字段吗?换句话说,对于给定的编译类,或者甚至在相同源文件的编译之间,顺序是否稳定?

4 个答案:

答案 0 :(得分:8)

它应该是稳定的,对于Oracle的JVM,它们的声明顺序,但你不应该依赖它。

您应该根据字段的名称(可能是声明类)来查找,而不是定位。

答案 1 :(得分:2)

至少在我的JVM上,

Class.getFields()以声明顺序返回字段。

另一方面,

Class.getMethods()并不总是如此。它返回它们(我相信)类加载器看到字符串的顺序。因此,如果两个类具有相同的方法名称,则第二个加载的类将在其他方法之前返回共享方法名称。

javap确认编译器按声明顺序写了两个字段和方法。

请参阅此代码示例的输出。

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class OrderTest {
    public static void main(String[] args) {
        // fields are in declaration order
        for (Field field : C1.class.getDeclaredFields()) {
            System.out.println(field.getName());
        }
        for (Field field : C2.class.getDeclaredFields()) {
            System.out.println(field.getName());
        }

        // methods, on the other hand, are not necessarily in declaration order.
        for (Method method : C1.class.getDeclaredMethods()) {
            System.out.println(method.getName());
        }
        for (Method method : C2.class.getDeclaredMethods()) {
            System.out.println(method.getName());
        }
    }
}

class C1 {
    public int foo;
    public int bar;
    public int getFoo() { return foo; }
    public int getBar() { return bar; }
}

class C2 {
    public int bar;
    public int foo;
    public int getBar() { return bar; }
    public int getFoo() { return foo; }
}

在我的JVM(1.7.0_45,Windows)上返回

foo
bar
bar
foo
getFoo
getBar
getFoo
getBar

答案 2 :(得分:1)

创建一个返回排序列表的辅助方法,并在需要字段列表时使用它。或者按名称而不是索引进行查找。

答案 3 :(得分:0)

属性的自然顺序使用readKeys()方法为Ujorm framework提供其键值对象。 结果的每个项目都具有类似的功能,如字段,包括从/向对象读取和写入值。例如,请参阅下一个代码:

 public class User extends AbstractUjo implements Serializable {

     /** Factory */
     private static final KeyFactory<User> f = newFactory(User.class);
     /** Keys: */
     public static final Key<User, Long> PID = f.newKey();
     public static final Key<User, Integer> CODE = f.newKey();
     public static final Key<User, String> NAME = f.newKey();
     public static final Key<User, Double> CASH = f.newKey();

     static {
         f.lock();
     }

     // Setters:
     public void setPid(Long pid) {
         PID.setValue(this, pid);
     }

     public void setCode(Integer code) {
         CODE.setValue(this, code);
     }

     public void setName(String name) {
         NAME.setValue(this, name);
     }

     public void setCash(Double cash) {
         CASH.setValue(this, cash);
     }

     // Getters ...
 }

键的自然顺序可以通过以下方式迭代:

 for (Key key : new User().readKeys()) {
     System.out.println("Key: " + key);
 }

有关详细信息,请参阅documentation