2010-08-06 21 views
123

tengo la clase siguiente:recuperar sólo los campos estáticos declarados en la clase de Java

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

¿Es posible utilizar la reflexión para obtener una lista de sólo 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 manera de determinar si una instancia Field representa un campo estático o no.

+0

Soy un java más nuevo, me gustaría saber por qué Java no puso éstos cuentan con todos en clase Field como C#, ¿Cuál es la ventaja de este diseño? Gracias. – Allen

+0

https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html#getModifiers-- – OrangeDog

Respuesta

244

Puede hacerlo de esta manera:

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

Eso es simple, puede utilizar modificadores para comprobar si una el 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"); 
} 
} 
2

me encontré con esta pregunta por accidente y se sentía que necesitaba una actualización de Java 8 usando corrientes:

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 es un poco embelished para facilitar la lectura. En realidad, lo más probable sería lo escribe así:

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