200

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.

2
  • I am a java newer,I want to know why Java did not put these feature all in Field class like C#,What is the benefit from this design? Thanks. Commented Apr 22, 2015 at 10:59
  • docs.oracle.com/javase/8/docs/api/java/lang/reflect/… Commented Nov 2, 2016 at 14:59

4 Answers 4

399

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);
    }
}
Sign up to request clarification or add additional context in comments.

Comments

21

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 Comments

"In actually, you would likely write it like this" ... why do you think that "in actuality" that readability is not important?
First off, I don't think mocking someones English on a site like this is appropriate. Aside from that, I do not believe that the comments in the embellished example serve to improve readability to someone even remotely familiar with streams, nor does the useless return variable. I would consider both noise if I encountered them in actual code. With more experience with streams under my belt, i would today opt to keep the original newlines for readability. Nobody is perfect. I aimed to provide both an example that was explicit for new programmers as well as one that was realistic.
I wasn't mocking your English. Your English is good. I don't even understand what you're talking about. And yes, I agree that the comments are superfluous and that the formatting of the first is much better. My point was that you seemed to suggest "embellishing for readability" is bad, when readability is an incredibly important code quality metric.
2

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

Comments

-1

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

1 Comment

This doesn't give a list of static fields.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.