Javareflection:类字段和方法的顺序是否标准化?

在Java类上使用reflection来访问所有字段,方法等等:
这些元素是否有标准化的顺序 (在某些标准中有规定)?

当然,我可以凭经验检查它,但是我需要知道它是否总是一样的。

编辑:
我等待的问题是:我需要什么命令;)
长话短说:我有JAXB注释的类,并且不想直观地表示这些类。 虽然XML属性的顺序既不与XML标准相关,也不与JAXB相关,但我希望具有特定顺序的可视化表示的XML属性。
例如:结束后开始。 这伤害了你的直觉。

根据文件 :

getFields()

返回一个包含Field对象的数组,该对象反映了由此Class对象表示的类或接口的所有可访问的公共字段。 返回的数组中的元素没有sorting,也没有任何特定的顺序。 如果类或接口没有可访问的公共字段,或者表示数组类,基元types或void,则此方法返回长度为0的数组。

getMethods()

返回一个包含Method对象的数组,该对象反映了由此Class对象表示的类或接口的所有公共成员方法,包括由类或接口声明的那些以及从超类和超接口inheritance的方法。 数组类返回从Object类inheritance的所有(公共)成员方法。 返回的数组中的元素没有sorting,也没有任何特定的顺序。 如果此Class对象表示一个没有公共成员方法的类或接口,或者此Class对象表示原始types或void,则此方法返回长度为0的数组。

基于我的注释的想法的样本。

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

即使getFields()和getMethods()以不特定的顺序返回结果,也可以将返回的数组中的元素添加到集合中,然后提供自己的Comparator对其进行sorting。

在这个例子中,我只是根据字母顺序sorting字段和方法 – 但是可以通过在相应的比较器中提供所需的逻辑来基于声明类,修饰符,返回types等对它们进行sorting。

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