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

Спасибо.

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

John Gardner 07.11.2008 10:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
1
9 010
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

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

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

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

Ответ принят как подходящий
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()]);
    }
 }

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

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

Другие вопросы по теме