Получить только статические поля, объявленные в классе Java
У меня есть следующий класс:
public class Test {
public static int a = 0;
public int b = 1;
}
Можно ли использовать отражение, чтобы получить только список статических полей? Я знаю, что могу получить массив всех полей с помощью Test.class.getDeclaredFields()
. Но, похоже, нет способа определить, представляет ли экземпляр Field
статическое поле или нет.
Ответы
Ответ 1
Вы можете сделать это так:
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);
}
}
Ответ 2
Я случайно наткнулся на этот вопрос и почувствовал необходимость обновления 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());
}
Ответ 3
Если вы можете добавлять зависимостей с открытым исходным кодом к своему проекту, вы также можете использовать
FieldUtils.readDeclaredStaticField(Test.class, "a" )
Ответ 4
Это просто, вы можете использовать модификатор, чтобы проверить, является ли поле статическим или нет. Вот пример кода для такого рода задач.
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");
}