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

我有以下class级:

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

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

你可以这样做:

 Field[] declaredFields = String.class.getDeclaredFields(); List<Field> staticFields = new ArrayList<Field>(); for (Field field : declaredFields) { if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) { staticFields.add(field); } } 

如果您可以将开放源代码依赖项添加到您的项目中,也可以使用FieldUtils.readDeclaredStaticField(Test.class,“a”)

这很简单,你可以使用Modifier来检查一个字段是否是静态的。 下面是这种任务的示例代码。

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

我偶然发现了这个问题,并且觉得需要使用stream的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()); }