通常のgetXXX
とsetXXX
のメソッドをフィールドに持つプレーンJava Object
をMap<String, Object>
のようなキーと値のペアに変換できますか?リフレクトを使用せずにJavaオブジェクトをキーと値のペアに変換する方法
Javaリフレクションに依存せずにこれを行う必要があるため、GWTなどのJava-to-Javascriptコンパイラで使用できます。
通常のgetXXX
とsetXXX
のメソッドをフィールドに持つプレーンJava Object
をMap<String, Object>
のようなキーと値のペアに変換できますか?リフレクトを使用せずにJavaオブジェクトをキーと値のペアに変換する方法
Javaリフレクションに依存せずにこれを行う必要があるため、GWTなどのJava-to-Javascriptコンパイラで使用できます。
私はMapSerialisationインタフェースを使用して前にこれをやった:
interface MapSerialisation {
Map<String, Object> toMap();
void fromMap(Map<String, Object>);
}
は、あなたのモデルオブジェクトのそれぞれにそれを実装し、翻訳のためにそれを使用します。
私が使用した別の方法は、Google Collectionsのトランスフォーマーで、JavaオブジェクトとJavascriptが望む構造体の間で変換するモデル変換関数を使用することです。
私はおそらくジャクソンを使ってJSONにシリアル化したいと思うでしょう。
リフレクションは、これを行う最も論理的な方法です。クラスのGetMethods/Fieldsは、技術的には全く反映されていないと主張する人もいます。
これを行う1つの方法は、オブジェクトのハッシュテーブル/マップを明示的に作成できるtoHash()関数を実装することです。
GWTには、反射の代わりにDeferred Bindingというメカニズムが付属しています。通常、このAPIはGWT.create(Class<?>)
を呼び出すだけで使用できますが、GWTコンパイルプロセス中に呼び出されるコードジェネレータ(Java-to-Javascriptトランスレーション)を記述するためにも使用できます。
とfromMap()
のメソッドを含むヘルパークラスをPOJOクラスのいずれかに出力するコードジェネレータを作成することができます。 GWTは、JClassType
,JMethod
などのクラスを持つJavaのリフレクションAPIに似たAPIを提供しています。これらは、getterとsetterのクラス(コードを生成したい)をクエリし、上記のメソッドを生成するために使用できますそれに応じて。
あなたのクライアントコードは、基本的に次のようになります。
Pojo1 pojo1 = ...;
// Pojo1Transformer is the class that is generated for your domain class Pojo1
Pojo1Transformer pojo1Transformer = GWT.create(Pojo1Transformer.class);
Map<String, Object> pojo1AsMap = pojo1Transformer.toMap(pojo1);
...
pojo1AsMap.put(Pojo1Transformer.NAME, "New Name");
Pojo1 changed = pojo1Transformer.fromMap(pojo1AsMap);