迭代java中的静态int值

我有一个简单的问题。 有没有办法(使用我想的reflection)来迭代一个类的所有静态值?

例如

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 

谢谢。

 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 c) { List list = new ArrayList(); 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()]); } } 

嘿..这很容易。 :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 ) ); } } 

您的解决方案适用于公共字段,但不适用于您的示例中的私有字段。 如果您希望能够访问类的私有字段,则需要使用getDeclaredFields()而不是getFields()。

你可以这样做:

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

然而,重要的是要注意,必须公开字段才能使其工作。 这不完全是你提出的要求,但它应该足够接近,你应该能够使它适合你所需要的。 显然,这不会做任何类型的error handling或任何事情,所以你应该确保你处理实际应用程序中的任何错误或exception。

作为替代方案,使用枚举并完全摆脱类变量(确切地说,枚举也是类变量:-)):

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