Recupere solo los campos estáticos declarados en la clase Java

163

Tengo la siguiente clase:

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

¿Es posible usar la reflexión para obtener solo una lista de los campos estáticos? Soy consciente de que puedo obtener una matriz de todos los campos con Test.class.getDeclaredFields(). Pero parece que no hay forma de determinar si una Fieldinstancia representa un campo estático o no.

Anders
fuente
Soy un Java más nuevo, quiero saber por qué Java no puso todas estas características en la clase Field como C #, ¿cuál es el beneficio de este diseño? Gracias.
Allen

Respuestas:

327

Puedes hacerlo así:

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);
    }
}
Abhinav Sarkar
fuente
12

Me topé con esta pregunta por accidente y sentí que necesitaba una actualización de Java 8 usando 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;
}

Obviamente, esa muestra está un poco adornada para facilitar la lectura. En realidad, probablemente lo escribirías así:

public static List<Field> getStatics(Class<?> clazz) {
    return Arrays.stream(clazz.getDeclaredFields()).filter(f ->
        Modifier.isStatic(f.getModifiers())).collect(toList());
}
Esfuerzo de torsión
fuente
44
"En realidad, probablemente lo escribirías así" ... ¿por qué crees que "en realidad" esa legibilidad no es importante?
Michael
2
En primer lugar, no creo que sea apropiado burlarse de alguien en inglés en un sitio como este. Aparte de eso, no creo que los comentarios en el ejemplo embellecido sirvan para mejorar la legibilidad para alguien incluso remotamente familiarizado con las transmisiones, ni la variable de retorno inútil. Consideraría ambos ruidos si los encontrara en el código real. Con más experiencia con transmisiones en mi haber, hoy optaría por mantener las nuevas líneas originales para facilitar la lectura. Nadie es perfecto. Intenté proporcionar tanto un ejemplo que fuera explícito para los nuevos programadores como uno que fuera realista.
Par el
3
No me estaba burlando de tu inglés. Su Inglés es bueno. Ni siquiera entiendo de qué estás hablando. Y sí, estoy de acuerdo en que los comentarios son superfluos y que el formato del primero es mucho mejor. Mi punto era que parecía sugerir que "embellecer la legibilidad" es malo, cuando la legibilidad es una métrica de calidad de código increíblemente importante.
Michael
0

Eso es simple, puede usar Modificador para verificar si un campo es estático o no. Aquí hay un código de muestra para ese tipo de tarea.

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