Utilisation de la reflection sur les classes Java pour accéder à tous les champs, méthodes, etc.:
Existe-t-il un ordre standardisé de ces éléments (spécifié dans certaines normes)?
Bien sûr, je pourrais vérifier cela empiriquement, mais j’ai besoin de savoir si c’est toujours la même chose.
MODIFIER:
J’ai attendu la question: Ce dont j’ai besoin de la commande;)
En bref: J’ai des classes annotées JAXB et je ne veux pas représenter ces classes visuellement. Bien que l’ordre des atsortingbuts XML ne soit pas pertinent pour le standard XML, ni pour JAXB, je souhaite avoir un certain ordre pour les atsortingbuts XML de la représentation visuelle.
Par exemple: start vient après la fin. Cela blesse l’intuition.
Selon la documentation :
getFields()
Retourne un tableau contenant des objects Field reflétant tous les champs publics accessibles de la classe ou de l’interface représentée par cet object Class. Les éléments du tableau renvoyés ne sont pas sortingés et ne se trouvent dans aucun ordre particulier. Cette méthode renvoie un tableau de longueur 0 si la classe ou l’interface n’a pas de champs publics accessibles ou s’il représente une classe de tableau, un type primitif ou un vide.
getMethods()
Renvoie un tableau contenant des objects Method reflétant toutes les méthodes membres publiques de la classe ou de l’interface représentée par cet object Class, y compris celles déclarées par la classe ou l’interface et celles héritées des superclasses et superinterfaces. Les classes de tableaux renvoient toutes les méthodes membres (publiques) héritées de la classe Object. Les éléments du tableau renvoyés ne sont pas sortingés et ne se trouvent dans aucun ordre particulier. Cette méthode retourne un tableau de longueur 0 si cet object Class représente une classe ou une interface sans méthode membre publique ou si cet object Class représente un type primitif ou un vide.
Un exemple pour mon idée basée sur des annotations.
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(Ssortingng[] args) { Field[] fields = SomeClass.class.getFields(); Arrays.sort(fields, new Comparator() { @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() { @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()); } } }
Même si getFields () et getMethods () renvoient des résultats sans ordre particulier, vous pouvez append les éléments dans les tableaux renvoyés aux collections et fournir votre propre comparateur pour les sortinger comme vous le souhaitez.
Dans cet exemple, je sortinge simplement les champs et les méthodes en fonction de l’ordre alphabétique de leurs noms – mais vous pouvez les sortinger en fonction de la classe de déclaration, des modificateurs, des types de retour, etc. en fournissant la logique requirejse dans le comparateur respectif.
public void PrintClassData(Class c) { Field[] fieldArray = c.getFields(); Method[] methodArray = c.getMethods(); SortedSet fields = new TreeSet (new FieldComparator()); fields.addAll(Arrays.asList(fieldArray)); SortedSet methods = new TreeSet (new MethodComparator()); methods.addAll(Arrays.asList(methodArray)); SsortingngBuffer b = new SsortingngBuffer("All About "); b.append(c.getName()); b.append("\nFields:\n"); for(Field f : fields) { b.append("\t"); b.append(Modifier.toSsortingng(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.toSsortingng(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.toSsortingng()); } private static class FieldComparator implements Comparator { public int compare(Field f1, Field f2) { return (f1.getName().compareTo(f2.getName())); } } private static class MethodComparator implements Comparator { public int compare(Method m1, Method m2) { return (m1.getName().compareTo(m2.getName())); } }