2008-11-07 8 views
6

Ich habe eine einfache Frage. Gibt es eine Möglichkeit (unter Verwendung von Reflexionen, die ich vermute), alle statischen Werte einer Klasse zu iterieren?iterieren static int Werte in Java

Zum Beispiel

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

Ausgabe

1 
2 
3 

Dank.

+1

zu viele Fragen suchen wie Hausaufgaben ... –

Antwort

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

Hey .. es war sehr einfach. : 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

Man könnte so etwas tun:

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 ist jedoch wichtig zu beachten, dass die Felder öffentlich sein müssen, damit dies funktioniert. Es ist nicht genau das, was Sie gefragt haben, aber es sollte nahe genug sein, dass Sie in der Lage sein sollten, es für das zu tun, was Sie brauchen. Offensichtlich führt dies keine Fehlerbehandlung oder irgendetwas aus, also sollten Sie sicherstellen, dass Sie alle Fehler oder Ausnahmen in Ihrer realen Anwendung behandeln.

2

Ihre Lösung funktioniert für öffentliche Felder, aber nicht für private Felder wie in Ihrem Beispiel. Wenn Sie auf die privaten Felder einer Klasse zugreifen möchten, müssen Sie getDeclaredFields() anstelle von getFields() verwenden.

+0

Großartig ... gute Info ... – OscarRyz

0

Als Alternative eine ENUM nutzen und vollständig loszuwerden, die Klassenvariablen bekommen (um genau zu sein, ist die Enum eine Klassenvariable :-) auch):

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