2008-11-07 8 views
6

J'ai une question simple. Existe-t-il un moyen (en utilisant des réflexions, je suppose) d'itérer toutes les valeurs statiques d'une classe?itérer les valeurs int en java

Par exemple

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

Sortie

1 
2 
3 

Merci.

+1

trop de questions regardent comme les devoirs ... –

Répondre

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

Hé ... c'était très 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

Vous pouvez faire quelque chose comme ceci:

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

Il est important de noter, cependant, que les champs doivent être publics pour que cela fonctionne. Ce n'est pas exactement ce que vous avez demandé, mais il devrait être assez proche pour que vous puissiez le faire fonctionner pour ce dont vous avez besoin. Évidemment, cela ne fait aucune sorte de gestion des erreurs ou quoi que ce soit, alors vous devriez vous assurer que vous gérez toutes les erreurs ou les exceptions dans votre application réelle.

2

Votre solution fonctionne pour les champs publics mais pas pour les champs privés comme dans votre exemple. Si vous voulez pouvoir accéder aux champs privés d'une classe, vous devez utiliser getDeclaredFields() au lieu de getFields().

+0

Super .. bonne Info ... – OscarRyz

0

Comme alternative, utiliser un ENUM et se débarrasser des variables de classe entièrement (pour être précis, l'ENUM est une variable de classe aussi bien :-)):

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