仅检索 Java 类中声明的静态字段

2022-08-31 06:39:16

我有以下类:

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

推荐