Java reflection: czy kolejność pól klas i metod jest ustandaryzowana?

Używanie odbicia na klasach Javy, aby uzyskać dostęp do wszystkich pól, metod i tak dalej:
Czy istnieje ustandaryzowany porządek tych elementów (który jest określony w jakiejś normie)?

Oczywiście, mogę to sprawdzić empirycznie, ale muszę wiedzieć, czy zawsze to samo.

Edytuj:
czekałem na pytanie: po co mi zamówienie;)
Krótko mówiąc: mam zajęcia z adnotacją JAXB i nie chcę reprezentuj te klasy wizualnie. Podczas gdy zamówienie atrybutów XML nie ma znaczenia dla XML standard, ani dla JAXB, chcę mieć określoną kolejność atrybutów XML dla wizualna reprezentacja.
Na przykład: początek następuje po końcu. To rani intuicję.

Author: ivan_ivanovich_ivanoff, 2009-07-08

3 answers

Według dokumentacji :

getFields()

Zwraca tablicę zawierającą obiekty pól odzwierciedlające wszystkie dostępne publiczne pola klasy lub interfejsu reprezentowane przez ten obiekt klasy. zwracane elementy tablicy nie są sortowane i nie są w żadnej określonej kolejności. ta metoda zwraca tablicę o długości 0, jeśli klasa lub interfejs nie ma dostępnych publicznych pól, lub jeśli reprezentuje klasę tablicy, Typ prymitywny lub void.

getMethods()

Zwraca tablicę zawierającą Obiekty metody odzwierciedlające wszystkie publiczne metody klasy lub interfejsu reprezentowane przez ten obiekt klasy, w tym te zadeklarowane przez klasę lub interfejs oraz te odziedziczone z superklas i superinterfaces. Klasy Array zwracają wszystkie (publiczne) metody należące do klasy obiektu. zwracane elementy tablicy nie są sortowane i nie są w żadnej określonej kolejności. ta metoda zwraca tablicę o długości 0, jeśli ten obiekt klasy reprezentuje klasę lub interfejs, który nie ma metod Public member, lub jeśli ten obiekt klasy reprezentuje typ prymitywny lub void.

 55
Author: Adam Paynter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-14 18:44:32

Próbka do mojego pomysłu opartego na adnotacjach.

public class FiledOrder {
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Order {
        int value();
    }
    public class SomeClass {
        @Order(value=2)
        public int field1;
        @Order(value=1)
        public int field2;
        // no annotation
        public int field3;
        @Order(value=1)
        public void start() { }
        @Order(value=2)
        public void end() { }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        Field[] fields = SomeClass.class.getFields();
        Arrays.sort(fields, new Comparator<Field>() {
            @Override
            public int compare(Field o1, Field o2) {
                Order or1 = o1.getAnnotation(Order.class);
                Order or2 = o2.getAnnotation(Order.class);
                // nulls last
                if (or1 != null && or2 != null) {
                    return or1.value() - or2.value();
                } else
                if (or1 != null && or2 == null) {
                    return -1;
                } else
                if (or1 == null && or2 != null) {
                    return 1;
                }
                return o1.getName().compareTo(o2.getName());
            }
        });
        for (Field f : fields) {
            System.out.println(f.getName());
        }
        Method[] methods = SomeClass.class.getMethods();
        Arrays.sort(methods, new Comparator<Method>() {
            @Override
            public int compare(Method o1, Method o2) {
                Order or1 = o1.getAnnotation(Order.class);
                Order or2 = o2.getAnnotation(Order.class);
                // nulls last
                if (or1 != null && or2 != null) {
                    return or1.value() - or2.value();
                } else
                if (or1 != null && or2 == null) {
                    return -1;
                } else
                if (or1 == null && or2 != null) {
                    return 1;
                }
                return o1.getName().compareTo(o2.getName());
            }
        });
        for (Method m : methods) {
            System.out.println(m.getName());
        }
    }

}
 33
Author: akarnokd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-08 17:15:00

Mimo że getFields() i getMethods() zwracają wyniki w żadnej konkretnej kolejności, możesz dodać elementy zwracanych tablic do kolekcji i dostarczyć własny komparator, aby je sortować w dowolny sposób.

W tym przykładzie po prostu sortuję pola i metody na podstawie kolejności alfabetycznej ich nazw - ale można je sortować na podstawie deklarowania klas, modyfikatorów, typów zwrotnych itp. poprzez dostarczenie wymaganej logiki w odpowiednim Komparatorze.

public void PrintClassData(Class c) {
    Field[] fieldArray = c.getFields();
    Method[] methodArray = c.getMethods();
    SortedSet<Field> fields = new TreeSet<Field>(new FieldComparator());
    fields.addAll(Arrays.asList(fieldArray));
    SortedSet<Method> methods = new TreeSet<Method>(new MethodComparator());
    methods.addAll(Arrays.asList(methodArray));

    StringBuffer b = new StringBuffer("All About ");
    b.append(c.getName());
    b.append("\nFields:\n");
    for(Field f : fields) {
        b.append("\t");
        b.append(Modifier.toString(f.getModifiers()));
        b.append(" ");
        b.append(f.getType());
        b.append(" ");
        b.append(f.getName());
        b.append("\n");
    }
    b.append("\nMethods:\n");
    for (Method m : methods) {
        b.append("\t");
        b.append(Modifier.toString(m.getModifiers()));
        b.append(" ");
        b.append(m.getReturnType());
        b.append(" ");
        b.append(m.getName());
        b.append("( ");
        for (Class param : m.getParameterTypes()) {
            b.append(param.getName());
            b.append(", ");
        }
        b.deleteCharAt(b.lastIndexOf(","));
        b.append(")\n");
    }
    System.out.println(b.toString());
}

private static class FieldComparator implements Comparator<Field> {

    public int compare(Field f1, Field f2) {
        return (f1.getName().compareTo(f2.getName()));
    }   
}

private static class MethodComparator implements Comparator<Method> {

    public int compare(Method m1, Method m2) {
        return (m1.getName().compareTo(m2.getName()));
    }

}
 8
Author: Nate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-08 13:56:23