2008-11-07 18 views
6

Tengo una pregunta simple. ¿Hay alguna manera (supongo que utilizando reflexiones) de iterar todos los valores estáticos de una clase?iterar valores int estáticos en java

Por ejemplo

class Any { 
    static int one = 1; 
    static int two = 2; 
    static int three = 3; 

    public static void main(String [] args) { 
      for(int i : magicMethod(Any.class)){ 
       System.out.println(i); 
      } 
    } 
} 

salida

1 
2 
3 

Gracias.

+1

demasiadas preguntas miran como la tarea ... –

Respuesta

15
import java.util.*; 
import java.lang.reflect.*; 

class Any { 
    static int one = 1; 
    static int two = 2; 
    static int three = 3; 

    public static void main(String [] args) { 
      for(int i : magicMethod(Any.class)){ 
       System.out.println(i); 
      } 
    } 

    public static Integer[] magicMethod(Class<Any> c) { 
     List<Integer> list = new ArrayList<Integer>(); 
     Field[] fields = c.getDeclaredFields(); 
     for (Field field : fields) { 
      try { 
       if (field.getType().equals(int.class) && Modifier.isStatic(field.getModifiers())) { 
        list.add(field.getInt(null)); 
       } 
      } 
      catch (IllegalAccessException e) { 
       // Handle exception here 
      } 
     } 
     return list.toArray(new Integer[list.size()]); 
    } 
} 
4

Hola ... fue muy fácil. : P

 Field [] constants = Main.class.getFields(); 
     Object some = new Main(); 
     for(Field field : constants){ 
      if(Modifier.isStatic(field.getModifiers()) && 
      field.getType() == int.class ) { 
        System.out.println(field.getInt(some )); 
      } 
     } 
1

Se podría hacer algo como esto:

import java.lang.reflect.*; 

public class Foo { 

public static int one = 1; 
public static int two = 2; 
public static int three = 3; 

public static void magicMethod(Class clz) throws Exception { 
    Field[] fields = clz.getFields(); 
    System.out.println(""+fields); 
    for(Field field : fields) { 
     int modifiers = field.getModifiers(); 
     if(! Modifier.isStatic(modifiers)) 
      continue; 
     System.out.println("" + field.get(null)); 
    } 
} 

public static void main(String[] args) throws Exception { 
    Foo.magicMethod(Foo.class); 
}} 

Es importante señalar, sin embargo, que los campos tienen que ser público para que esto funcione. No es exactamente lo que pediste, pero debe ser lo suficientemente cerca para que puedas hacer que funcione para lo que necesitas. Obviamente, esto no implica ningún tipo de manejo de errores ni nada, por lo que debe asegurarse de manejar cualquier error o excepción en su aplicación real.

2

Su solución funciona para campos públicos pero no para campos privados como los que tiene en su ejemplo. Si desea poder acceder a los campos privados de una clase, necesita usar getDeclaredFields() en lugar de getFields().

+0

Genial ... buena información ... – OscarRyz

0

Como alternativa, utilice una enumeración y deshacerse de las variables de clase por completo (para ser más precisos, la enumeración es una variable de clase, así :-)):

class Any { 
    enum Number { 
     ONE(1), 
     TWO(2), 
     THREE(3); 

     Number(int number) { 
      this.number = number; 
     } 

     int number; 
    }; 

    public static void main(String [] args) { 
     for (Number value : Number.values()) { 
      System.out.println(value.number); 
     } 
    } 
} 
Cuestiones relacionadas