2008-11-07 12 views
6

Ho una domanda semplice. C'è un modo (usando riflessioni, suppongo) per iterare tutti i valori statici di una classe?iterate valori int statici in java

Per esempio

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

uscita

1 
2 
3 

Grazie.

+1

troppe domande sembrano come i compiti ... –

risposta

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

Ehi .. è stato molto facile. : 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

Si potrebbe fare qualcosa di simile:

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

E 'importante notare, tuttavia, che i campi devono essere pubblico per far funzionare tutto questo. Non è esattamente quello che hai chiesto, ma dovrebbe essere abbastanza vicino da poter essere in grado di farlo funzionare per quello che ti serve. Ovviamente questo non comporta alcun tipo di gestione degli errori o altro, quindi è necessario assicurarsi di gestire eventuali errori o eccezioni nella propria applicazione reale.

2

La soluzione funziona per campi pubblici ma non per campi privati ​​come nel tuo esempio. Se vuoi essere in grado di accedere ai campi privati ​​di una classe, devi usare getDeclaredFields() invece di getFields().

+0

Grande .. buona informazione ... – OscarRyz

0

In alternativa, utilizzare un enum e sbarazzarsi delle variabili di classe interamente (per la precisione, l'enumerazione è una variabile di classe così :-)):

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