2008-11-07 64 views
6

我有一個簡單的問題。有沒有一種方法(使用反射我想)迭代一個類的所有靜態值?在java中迭代靜態int值

例如

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

輸出

1 
2 
3 

感謝。

+1

太多問題看像作業... – 2008-11-07 07:03:27

回答

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

嘿..這很容易。 :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

你可以做這樣的事情:

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

它然而,必須指出的是,場必須公開這個工作是很重要的。這不完全是你問的,但它應該足夠接近,你應該能夠使其滿足你的需求。很明顯,這不會做任何錯誤處理或任何事情,所以你應該確保你在真正的應用程序中處理任何錯誤或異常。

2

您的解決方案適用於公共領域,但不適用於您的示例中的私人領域。如果您希望能夠訪問某個類的私有字段,則需要使用getDeclaredFields()而不是getFields()。

+0

非常好..信息... – OscarRyz 2008-11-07 03:23:41

0

作爲替代方案,使用一個枚舉,擺脫完全類變量的(準確地說,枚舉是一個類變量,以及:-)):

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