У меня простой вопрос. Есть ли способ (я полагаю, используя отражения) перебрать все статические значения класса?
Например
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
Спасибо.




Эй .. это было очень легко. :П
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);
}
}
}
слишком много вопросов похоже на домашнее задание ...