Отримайте лише статичні поля, оголошені в класі 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

Це просто, ви можете використовувати модифікатор, щоб перевірити, чи є поле статичним чи ні. Ось зразок коду для подібного завдання.

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");
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.