Получить только статические поля, объявленные в классе Java

у меня есть следующий класс:

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

можно ли использовать отражение, чтобы получить список только статические поля? Я знаю, что могу получить массив всех полей с помощью Test.class.getDeclaredFields(). Но, похоже, нет никакого способа определить, если Field экземпляр представляет статическое поле или нет.

4 ответов


вы можете сделать это так:

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 с помощью streams:

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

очевидно, что этот образец немного embelished для удобочитаемости. На самом деле, вы, вероятно, напишете это так:

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

Если вы можете добавить зависимости с открытым исходным кодом в свой проект, вы также можете использовать FieldUtils.readDeclaredStaticField (тест.класс"а")


Это просто, вы можете использовать модификатор, чтобы проверить, является ли поле статическим или нет. Вот пример кода для такого рода задач.

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