次のクラスがあります。
public class Test {
public static int a = 0;
public int b = 1;
}
リフレクションを使用して静的フィールドのみのリストを取得することは可能ですか?私はTest.class.getDeclaredFields()
ですべてのフィールドの配列を取得できることを知っています。しかし、Field
インスタンスが静的フィールドを表すかどうかを判断する方法はないようです。
次のようにできます:
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);
}
}
私は偶然この質問に出くわし、ストリームを使用した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());
}
プロジェクトにオープンソースの依存関係を追加できる場合は、 FieldUtils.readDeclaredStaticField(Test.class、 "a") も使用できます。
Thats Simple、Modifierを使用して、フィールドが静的かどうかを確認できます。この種のタスクのサンプルコードを次に示します。
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");
}