如何在不使用反射的情况下将Java对象转换为键值对

时间:2012-01-08 12:50:34

标签: java gwt

是否可以将纯字段Object与其字段的常规getXXXsetXXX方法转换为键值对,例如Map<String, Object>

我需要这样做而不依赖于Java反射,所以它可以用于像GWT这样的Java-To-Javascript编译器。

3 个答案:

答案 0 :(得分:3)

GWT附带一种名为Deferred Binding的机制作为反射的替代品。虽然通常只调用GWT.create(Class<?>)来使用此API,但它也可用于编写在GWT编译过程中调用的代码生成器(即Java-to-Javascript转换)。

您可以使用它来创建将为任何POJO类输出的代码生成器 一个包含toMap()fromMap()方法的辅助类。 GWT提供的API类似于Java的反射API,类似JClassTypeJMethod等。这些API可用于查询其getter的类(您希望为其生成代码)和设置并相应地生成上述方法。

您的客户端代码基本上会是这样的:

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);

答案 1 :(得分:2)

我以前使用MapSerialisation接口完成了这个:

interface MapSerialisation {
    Map<String, Object> toMap();
    void fromMap(Map<String, Object>);
}

在每个模型对象上实现它并将其用于翻译。

我使用的另一种方法是Google Collections的变形金刚,并具有模型转换功能,可以在Java对象和Javascript想要的结构之间进行转换。

我可能很想使用Jackson来串行化为JSON。

答案 2 :(得分:0)

反射是最合乎逻辑的方法,有些人可能认为类GetMethods / Fields在技术上并不完全是反射。

实现此目的的一种方法是实现toHash()函数,您可以在其中显式创建对象的Hashtable / Map。