使用反射动态保存类中的所有字段?("<字段名>","<字段值>")

3
我将尝试使用反射来避免对配置类进行硬编码的序列化,但是我遇到了一个问题,无法找到任何解决方法。下面是我的尝试:
我有一个类如下:
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更好的示例并帮助我吗?


1
new int[]{1,2,3}.toString()不会按照您的期望工作。它将委托给Object.toString(); - driangle
2
为什么不使用XML或JSON?两者都有现成的序列化器,而且相当易读。 - Ilia G
1
@llia G,我实际上并没有使用Properties对象将结果保存到文件中。我正在研究一种相当复杂的方法来保存GUI的设置,并从配置文件中启动它们。我将使用属性文件来设置GUI初始化时JComponent的值。我使用了Component.setName(String)方法来设置Configuration文件中对应值的名称。 - user1125622
1
由于您无法在运行时知道确切的字段类型,因此您必须为每个原始类型进行情况分析,并使用反射类在Field类上调用相应的get<type>方法。 - Roberto Linares
1
@ggreiner 有没有办法将数组解析为 Object[]? - user1125622
@Roberto Linares 这不是什么大问题。我正在使用 int、bool 和 int[]。 - user1125622
2个回答

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
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接