2008-11-07 5 views
6

У меня есть простой вопрос. Есть ли способ (используя отражения, я полагаю), чтобы итерировать все статические значения класса?итерация статических значений int в java

Например

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

слишком много вопросов смотрите как домашнее задание ... –

ответ

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

Отличный .. good Info ... – OscarRyz

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

 Смежные вопросы

  • Нет связанных вопросов^_^