Retrieve only static fields declared in Java class

2019-01-10 12:03发布

问题:

I have the following class:

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

Is it possible to use reflection to get a list of the static fields only? I'm aware I can get an array of all the fields with Test.class.getDeclaredFields(). But it seems there's no way to determine if a Field instance represents a static field or not.

回答1:

You can do it like this:

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:

I stumbled across this question by accident and felt it needed a Java 8 update using streams:

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

Obviously, that sample is a bit embelished for readability. In actually, you would likely write it like this:

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


回答3:

If you can add open-source dependencies to your project you can also use FieldUtils.readDeclaredStaticField(Test.class,"a")



回答4:

Thats Simple , you can use Modifier to check if a field is static or not. Here is a sample code for that kind of task.

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