是否可以将纯字段Object
与其字段的常规getXXX
和setXXX
方法转换为键值对,例如Map<String, Object>
?
我需要这样做而不依赖于Java反射,所以它可以用于像GWT这样的Java-To-Javascript编译器。
答案 0 :(得分:3)
GWT附带一种名为Deferred Binding的机制作为反射的替代品。虽然通常只调用GWT.create(Class<?>)
来使用此API,但它也可用于编写在GWT编译过程中调用的代码生成器(即Java-to-Javascript转换)。
您可以使用它来创建将为任何POJO类输出的代码生成器
一个包含toMap()
和fromMap()
方法的辅助类。 GWT提供的API类似于Java的反射API,类似JClassType
,JMethod
等。这些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。