1

我对java相当陌生并且遇到了一个问题。我的任务是创建一个包含方法 write(Object obj) 的类,该方法将对象的类型以及所有属性的名称和类型写入文件。由于对象可能具有对象/对象数组作为属性,因此涉及递归。

这是代码:

    public void write(Object obj) throws Exception {

    if(obj == null)
    {
        out.close();
        return;
    }

    Class c = obj.getClass();
    Class d;
    Field fields_c[] = c.getDeclaredFields();
    System.out.println("class_name:" + c.getName());

    int i, j;
    String tab = new String("");


    for(i = 0; i < indent_level; i++)
    {
        tab = tab + "\t";
    }

    out.write(tab + "class_name:" + c.getName() + "\n");

    for(i = 0; i < fields_c.length; i++) {
        System.out.println("field name: " + fields_c[i].getName() + " ");

        c = fields_c[i].getType();
        fields_c[i].setAccessible(true);

        if(c.isPrimitive()) {
            out.write("\t" + tab + "field_name:" + c.toString() + "\n");
        }
        else if(c.isArray()) {
            System.out.println("field of type array with elements of type:" + c.getComponentType());

            for(j = 0; j < Array.getLength(c); j++)
            {
                d = Array.get(c, j).getClass();
                indent_level = indent_level + 1;
                this.write(d);
                indent_level = indent_level - 1;            
            }
        }
        else
        {
            System.out.println("field is not primitive of type:" + c.getName());
            Object foo = fields_c[i].get(obj);
            indent_level = indent_level + 1;
            this.write(foo);
            indent_level = indent_level - 1;
        }
    }
}

如果我调用该方法并给出一个具有数组属性的对象,则会出现异常;直到数组被正确写入输出文件的所有属性。例外是“java.lang.IllegalArgumentException:参数不是数组”。

4

3 回答 3

1

Ind = Array.get(c, j).getClass(); c是 java.lang.Class 类型,但需要一个数组。

您应该将其更改为d = Array.get(fields_c[i].get(obj), j)c#getComponentType用于获取数组的类型。

于 2012-04-09T21:50:11.557 回答
0

这可能不是您所追求的,但如果这与序列化有关,那么我推荐“简单”;

http://simple.sourceforge.net/

它使 Java <=> XML 序列化变得异常简单。

于 2012-04-09T21:51:07.157 回答
0

为什么要传递元素类而不是元素:

        Object[] array = fields_c[i].get(obj);
        for(j = 0; j < Array.getLength(array); j++)
        {
            Object foo = Array.get(array, j); // not .getClass()
            indent_level = indent_level + 1;
            this.write(foo);
            indent_level = indent_level - 1;            
        }
于 2012-04-09T21:53:01.137 回答