В моей 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