6

xmlをJavaオブジェクトに変換する逆シリアル化メソッドを書いています。これを動的に行い、特定のタイプへのハードコードされた参照を記述しないようにします。

たとえば、これは私のクラスの1つの簡略化されたバージョンです。

public class MyObject { 
   public ArrayList<SubObject> SubObjects = new ArrayList<SubObject>();
}

メソッドの簡略版を次に示します。

public class Serializer {    
    public static <T> T fromXml(String xml, Class<T> c) {
       T obj = c.newInstance();       
       Field field = obj.getClass().getField("SubObjects");    
       //help : create instance of ArrayList<SubObject> and add an item
       //help#2 : field.set(obj, newArrayList);

       return obj;
    }
}

このメソッドの呼び出しは次のようになります。

MyObject obj = Serializer.fromXml("myxmldata", MyObject.class);

私はJavaを学ぶC#開発者なので、これが些細な問題である場合はご容赦ください。

ありがとう!

4

4 に答える 4

10

かなり近いものにする必要があります:

Object list = field.getType().newInstance();

Method add = List.class.getDeclaredMethod("add",Object.class);

add.invoke(list, addToAddToList);

お役に立てれば。

于 2009-07-07T16:54:47.100 に答える
3

ここでの本当の問題は、XML から Java オブジェクトへの移行にあるようです。その場合 (そして Java は初めてなので)、自分で開発するよりも優れた解決策は、次のような既存のテクノロジを調査することです。

于 2009-07-07T17:01:08.460 に答える
0

生の型付き List(つまり、型パラメーターなし)を作成する必要があります。

List subs = deserialize( ... );

Listクラスにraw型を直接設定する場合:

obj.setSubObjects(subs); //You'll get an "unchecked cast" warning at compile time

Listコンパイラは警告を発しますが、これは正当なJavaコードであり、パラメータタイプ情報が失われるため、実行時に問題なく実行されます(つまり、実行時にaとaの間に違いはありませんList<SomeClass>)。もちろん反射的に設定することもできます。

于 2009-07-07T16:53:39.647 に答える
0

Javaジェネリックでは、単なる構文シュガーであり、ランタイムには存在しません。これが、実行時に汎用オブジェクトをプログラムで作成できない理由です。非一般的なリストとキャストを作成してみてください(ただし、私の経験はGWTに限られているため、わかりません)。

于 2009-07-07T16:49:20.437 に答える