2008-11-07 28 views
6

Mam proste pytanie. Czy istnieje sposób (używając refleksji, jak sądzę) do iteracji wszystkich wartości statycznych klasy?iteruj statyczne wartości int w java

Na przykład

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

Output

1 
2 
3 

dzięki.

+1

zbyt wiele pytań wyglądać jak praca domowa ... –

Odpowiedz

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

Hej ... to było bardzo łatwe. : 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

Można zrobić coś takiego:

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

Ważne jest, aby pamiętać jednak, że pola muszą być publiczne, aby to zadziałało. Nie jest to dokładnie to, o co prosiłeś, ale powinno być na tyle blisko, aby być w stanie sprawić, by działało zgodnie z potrzebami. Oczywiście nie robi to żadnej obsługi błędów ani niczego, więc powinieneś upewnić się, że załatwisz jakiekolwiek błędy lub wyjątki w twojej prawdziwej aplikacji.

2

Twoje rozwiązanie działa dla pól publicznych, ale nie dla pól prywatnych, takich jak w twoim przykładzie. Jeśli chcesz mieć dostęp do prywatnych pól klasy, musisz użyć getDeclaredFields() zamiast getFields().

+0

Świetne .. dobra informacja ... – OscarRyz

0

Jako alternatywa, użyj enum i pozbyć się zmiennych klasowych całkowicie (być precyzyjny, enum jest zmienną klasy jako dobrze :-)):

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