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

And*_*ers 152 java reflection static field

我有以下课程:

public class Test {
    public static int a = 0;
    public int b = 1;
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用反射来获取静态字段列表?我知道我可以获得所有字段的数组Test.class.getDeclaredFields().但似乎没有办法确定Field实例是否代表静态字段.

Abh*_*kar 304

你可以这样做:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Tor*_*que 9

我偶然偶然发现了这个问题,觉得需要使用流来进行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;
}
Run Code Online (Sandbox Code Playgroud)

显然,该样本有点可读性.实际上,您可能会这样写:

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

  • “实际上,您可能会这样写”……为什么您认为“实际上”可读性并不重要? (3认同)
  • 首先,我认为在这样的网站上嘲笑某人的英语是不合适的。除此之外,我认为修饰示例中的注释不能提高即使是非常熟悉流的人的可读性,也不会导致无用的返回变量。如果我在实际代码中遇到它们,我会考虑这两种噪声。有了更多关于流的经验,我今天选择保留原始换行符以提高可读性。没有人是完美的。我旨在提供一个既适合新程序员使用的示例,又可以提供一个现实的示例。 (2认同)
  • 我不是在嘲笑你的英语。你的英文很好。我什至不明白你在说什么。是的,我同意这些注释是多余的,并且第一个的格式要好得多。我的观点是,当可读性是非常重要的代码质量指标时,您似乎建议“赞扬可读性”是不好的。 (2认同)