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 に答える