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

2022-08-31 19:46:46

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

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

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


答案 1

根据文档

getFields()

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

getMethods()

返回一个包含 Method 对象的数组,该数组反映由此类对象表示的类或接口的所有公共成员方法,包括由类或接口声明的方法以及从超类和超接口继承的方法。数组类返回从 Object 类继承的所有(公共)成员方法。返回的数组中的元素不进行排序,也不按任何特定顺序排列。如果 Class 对象表示没有公共成员方法的类或接口,或者如果 Class 对象表示基元类型或 void,则此方法返回长度为 0 的数组。


答案 2

我基于注释的想法的示例。

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

}