Javaクラスで宣言された静的フィールドのみを取得する


163

次のクラスがあります。

public class Test {
    public static int a = 0;
    public int b = 1;
}

リフレクションを使用して静的フィールドのみのリストを取得することは可能ですか?私はすべてのフィールドの配列をで取得できることを知っていますTest.class.getDeclaredFields()。しかし、Fieldインスタンスが静的フィールドを表すかどうかを判断する方法はないようです。


私は新しいJavaですが、Javaがこれらの機能をすべてC#のようなフィールドクラスに配置しなかった理由を知りたいのですが、この設計のメリットは何ですか?ありがとう。
アレン

回答:


327

あなたはこのようにそれを行うことができます:

Field[] declaredFields = Test.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<Field>();
for (Field field : declaredFields) {
    if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
        staticFields.add(field);
    }
}

12

私は偶然この質問に出くわし、ストリームを使用したJava 8の更新が必要だと感じました。

public static List<Field> getStatics(Class<?> clazz) {
    List<Field> result;

    result = Arrays.stream(clazz.getDeclaredFields())
            // filter out the non-static fields
            .filter(f -> Modifier.isStatic(f.getModifiers()))
            // collect to list
            .collect(toList());

    return result;
}

明らかに、そのサンプルは読みやすくするために少し装飾されています。実際には、次のように書くでしょう:

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}

4
「実際には、こんな風に書いてしまうのではないでしょうか」...読みやすさは重要ではないと「実際に」考えているのはなぜですか。
マイケル

2
まず、このようなサイトで誰かの英語をあざけるのは適切ではないと思います。それとは別に、装飾された例のコメントが、ストリームに慣れ親しんでいる人にとっても読みやすさを向上させるのに役立つとは思いませんし、役に立たない戻り変数も同様です。実際のコードでそれらに遭遇した場合、両方のノイズを検討します。私のもとでストリームの経験が増えたため、今日は読みやすさのために元の改行を維持することにしました。誰も完璧ではありません。新しいプログラマーにとって明示的な例と現実的な例の両方を提供することを目指しました。
トルク

3
私はあなたの英語をからかっていませんでした。あなたの英語は上手です。私はあなたが何を話しているのかさえ理解していません。そして、はい、私はコメントが不必要であり、最初のフォーマットがはるかに優れていることに同意します。私の要点は、読みやすさが非常に重要なコード品質メトリックである場合、「読みやすさを装飾する」ことは悪いことを示唆しているように思われたということです。
マイケル


0

つまり、モディファイアを使用して、フィールドが静的かどうかを確認できます。この種のタスクのサンプルコードを次に示します。

public static void printModifiers(Object o) {
    Class c = o.getClass();
    int m = c.getModifiers();
    if (Modifier.isPublic(m))
        System.out.println ("public");
    if (Modifier.isAbstract(m))
        System.out.println ("abstract");
    if (Modifier.isFinal(m))
        System.out.println ("final");
    if(Modifier.isStatic(m))
        System.out.println("static");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.