52

Java クラスでリフレクションを使用してすべてのフィールド、メソッドなどにアクセスする:
これらの要素の標準化された順序はありますか (標準で指定されています)。

もちろん、経験的に確認することはできますが、常に同じかどうかを知る必要があります。

編集:
私は質問を待っていました:私は何のために注文が必要ですか;)
簡単な話:私はJAXBアノテーション付きのクラスを持っており、これらのクラスを視覚的に表現したくありません。XML 属性の順序は XML 標準にも JAXB にも関係ありませんが、視覚的表現のために XML 属性を特定の順序にしたいと考えています。
例: start は end の後に続きます。これは直感を傷つけます。

4

3 に答える 3

69

ドキュメントによると:

getFields()

このClassオブジェクトによって表されるクラスまたはインターフェイスのアクセス可能なすべてのパブリックフィールドを反映するFieldオブジェクトを含む配列を返します。返される配列内の要素は並べ替えられておらず、特定の順序ではありません。このメソッドは、クラスまたはインターフェイスにアクセス可能なパブリックフィールドがない場合、または配列クラス、プリミティブ型、またはvoidを表す場合、長さ0の配列を返します。

getMethods()

クラスまたはインターフェイスによって宣言されたものや、スーパークラスおよびスーパーインターフェイスから継承されたものを含む、このClassオブジェクトによって表されるクラスまたはインターフェイスのすべてのパブリックメンバーメソッドを反映するMethodオブジェクトを含む配列を返します。配列クラスは、Objectクラスから継承されたすべての(パブリック)メンバーメソッドを返します。返される配列内の要素は並べ替えられておらず、特定の順序ではありません。このClassオブジェクトがパブリックメンバーメソッドを持たないクラスまたはインターフェイスを表す場合、またはこのClassオブジェクトがプリミティブ型またはvoidを表す場合、このメソッドは長さ0の配列を返します。

于 2009-07-08T12:42:48.497 に答える
42

私の注釈ベースのアイデアのサンプル。

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

}
于 2009-07-08T17:15:00.027 に答える