使用反射动态保存类中的所有字段? ( “<字段名>”, “<fieldValue方法>”)</fieldValue方法> </字段名>

时间:2012-02-07 04:27:57

标签: java serialization reflection properties

我试图通过使用Reflection来避免对配置类的序列化进行硬编码,而我遇到了无法解决问题的情况。这就是我想要做的。

我有一个类似的课程

public class Configuration {

   public boolean bool = false;
   public int integer = 1;
   public int[] intArray = {0, 1};

}

我想使用反射将名称和值保存到一个  属性字段。

--properties--
bool=false
integer=1
intArray=0,1

名称部分非常简单。我的问题是获取每个字段的值,特别是获取每个int []的值。除了数组之外,所有值都是原始的,因此toString()可以正常工作。

任何人都可以展示比Oracle更好的例子并帮助我吗?

2 个答案:

答案 0 :(得分:3)

你必须使用数组吗?如果没有,您可以将对象表示为列表,并打印整数的列表表示。

public boolean bool = false;
public int integer = 1;
public int[] intArray = {0, 1}; // <-- This prints array's memory address
public List<Integer> intList = Arrays.asList(1, 2 , 3); // <-- This prints [1,2,3]

public static void main(String[] args) throws Exception {
     Config c = new Config();
     for ( Field f : c.getClass().getDeclaredFields() ) {
           System.out.println(f.get(c));
     }

 }

或者,您可以在运行时执行此操作。

if ( "int[]".equals(f.getType().getSimpleName() ) ) {
   // do stuff
}

答案 1 :(得分:0)

您可以使用java.utils.Arrays.toString(int [] a)方法。 要获得正确的数组类型,您可以在Kal的答案中使用f.getType()。isArray()和f.getType()。getComponentType()。