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

我有以下课程:

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

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

100920 次浏览

你可以这样做:

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

如果可以向项目中添加开源依赖项,也可以使用 ReadDeclaredStaticField (Test.class,“ a”)

这很简单,您可以使用修饰符来检查字段是否是静态的。 下面是这类任务的示例代码。

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

我偶然发现了这个问题,觉得它需要一个使用流的 Java8更新:

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