Class.getFields() 返回的字段顺序
2022-09-03 15:08:22
Javadoc表示:“返回的数组中的元素没有排序,也不以任何特定的顺序排列。Class.getFields()
关于订单实际如何确定的任何提示?当我执行此方法两次时,是否有可能以不同的顺序获取字段?换句话说,对于给定的编译类,甚至在同一源文件的编译之间,顺序是否稳定?
Javadoc表示:“返回的数组中的元素没有排序,也不以任何特定的顺序排列。Class.getFields()
关于订单实际如何确定的任何提示?当我执行此方法两次时,是否有可能以不同的顺序获取字段?换句话说,对于给定的编译类,甚至在同一源文件的编译之间,顺序是否稳定?
它应该是稳定的,对于Oracle的JVM来说,这是它们被声明的顺序,但你不应该依赖这一点。
您应该根据字段的名称(并可能声明类)而不是位置进行查找。
至少在我的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