【问题标题】:Using reflection to dynamically save all the fields in a class? ("<FieldName>","<FieldValue>")使用反射动态保存类中的所有字段? ("<字段名>","<字段值>")
【发布时间】:2012-02-28 13:42:59
【问题描述】:

我试图通过使用反射来避免对配置类的序列化进行硬编码,但我遇到了一种我无法弄清楚的情况。这就是我想要做的。

我有这样的课

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 更好的例子并帮助我?

【问题讨论】:

  • new int[]{1,2,3}.toString() 不会像您期望的那样工作。它将委托给Object.toString();
  • 为什么不使用 XML 或 JSON?两者都已准备好使用序列化程序并且相当易于阅读。
  • @llia G 我实际上并没有使用 Propteries 对象将结果保存到文件中。我正在研究一种非常复杂的方法来保存 gui 的设置,并从配置文件中启动它们。我将使用属性文件在 gui 启动时设置 JComponent 的值。我使用了Component.setName(String)方法在Configuration文件中对应值的名称。
  • 由于您在运行时无法知道确切的字段类型,因此您必须为每个原语创建一个案例,并使用反射类调用 Field 类的相应 get 方法。跨度>
  • @ggreiner 是否可以将数组解析为 Object[]?

标签: java serialization reflection properties


【解决方案1】:

你必须使用数组吗?如果不是,您可以将您的对象表示为一个列表,这将打印您的整数的列表表示。

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
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2013-07-07
      相关资源
      最近更新 更多