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


163

我有以下课程:

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

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


我是Java新手,我想知道为什么Java没有像C#那样将所有这些功能都放在Field类中,这种设计有什么好处?谢谢。
艾伦

Answers:


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");
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.