повторять статические значения int в Java - PullRequest
8 голосов
/ 07 ноября 2008

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

Например

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

Спасибо.

Ответы [ 5 ]

17 голосов
/ 07 ноября 2008
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 голосов
/ 07 ноября 2008

Эй .. это было очень легко. : 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  ) );
          }
      }
2 голосов
/ 07 ноября 2008

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

1 голос
/ 07 ноября 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 );
}}

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

0 голосов
/ 03 ноября 2011

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

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...