web-dev-qa-db-fra.com

Java Réflexion: L'ordre des champs de classe et des méthodes sont-ils normalisés?

Utilisation de la réflexion sur Java classes pour accéder à tous les champs, méthodes, etc.
[.____] Y a-t-il une commande normalisée de ces éléments (qui est spécifiée dans certaines normes)?

Bien sûr, je pourrait Vérifiez-le empiriquement, mais j'ai besoin de savoir si c'est toujours la même chose.

Edit :
[.____] j'ai attendu la question suivante: ce dont j'ai besoin de la commande pour;)
Longue histoire courte: j'ai des cours annotés Jaxb et je veux ne pas représenter ces classes visuellement. Bien que l'ordre des attributs XML ne soit ni pertinent pour la norme XML, ni pour JAXB, je souhaite avoir un certain ordre des attributs XML pour la représentation visuelle.
[.____] Par exemple: commence après la fin. Cela fait mal l'intuition.

45

Un échantillon pour mon idée basée sur l'annotation.

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());
        }
    }

}
36
akarnokd

Même si getfields () et getMethods () ne donne aucun ordre particulier, vous pouvez ajouter les éléments dans les tableaux retournés aux collections et fournir à votre propre comparateur pour les trier, mais vous voulez.

Dans cet exemple, je trie simplement les champs et les méthodes basés sur l'ordre alphabétique de leurs noms - mais vous pouvez les trier en fonction de la classe, des modificateurs, des types de retour, etc. en fournissant la logique requise dans le comparateur respectif.

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
Nate