перебирать статические значения 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

Спасибо.


person OscarRyz    schedule 07.11.2008    source источник
comment
слишком много вопросов похоже на домашнее задание...   -  person John Gardner    schedule 07.11.2008


Ответы (4)


Эй.. это было очень легко. :П

      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  ) );
          }
      }
person OscarRyz    schedule 07.11.2008

Ваше решение работает для общедоступных полей, но не для частных полей, как в вашем примере. Если вы хотите иметь доступ к закрытым полям класса, вам нужно использовать getDeclaredFields() вместо getFields().

person Robert Gamble    schedule 07.11.2008

Вы можете сделать что-то вроде этого:

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

Однако важно отметить, что поля должны быть общедоступными, чтобы это работало. Это не совсем то, что вы просили, но это должно быть достаточно близко, чтобы вы могли заставить его работать для того, что вам нужно. Очевидно, что это не выполняет какую-либо обработку ошибок или что-то еще, поэтому вы должны убедиться, что обрабатываете любые ошибки или исключения в своем реальном приложении.

person Jason Coco    schedule 07.11.2008

В качестве альтернативы используйте перечисление и полностью избавьтесь от переменных класса (точнее, перечисление также является переменной класса :-)):

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);
        }
    }
}
person helpermethod    schedule 03.11.2011