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

163

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

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

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

Андерс
источник
Я новичок в Java, я хочу знать, почему Java не поместила все эти функции в класс Field, такой как 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

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

paskos
источник
4
Это не дает список статических полей.
OrangeDog
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");
}
Салман Салех
источник