Java reflection: Is the order of class fields and methods standardized?

前端 未结 3 1075
情深已故
情深已故 2020-11-28 08:31

Using reflection on Java classes to access all field, methods, and so on:
Is there a standardized order of these elements (which is specified in some st

3条回答
  •  猫巷女王i
    2020-11-28 09:14

    A sample for my annotation based idea.

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

提交回复
热议问题