如何将对象转换为从String变量派生的类?

时间:2018-01-09 14:23:17

标签: java casting

我正在构建一条FIX消息,在典型情况下将构建如下:

Message message =  new News();
message.setField(new SenderCompID("me"));
message.setField(new TargetCompID("you"));
...
message.setField(new BookSubType("whatever"));

输入是一个哈希映射:

HashMap<String, String> hmap = new HashMap<String, String>();
hmap.put("SenderCompID", "me");
hmap.put("TargetCompID", "you");
…
hmap.put("BookSubType", "whatever");

从此输入构造消息的一种方法是:

String senderCompID = hmap.get("SenderCompID");
if (senderCompID != null && !senderCompID.equals("")) {
    message.setField(new SenderCompID(senderCompID));
}
…

对于每个领域都是如此。 但是有太多的领域,我最终会花几天时间写这篇文章。如果我可以使用hmap键动态创建对象,那将会很方便。到目前为止,我最好的尝试是:

for (Map.Entry<String, String> entry : hmap.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();

    Class c = Class.forName(key);
    Constructor con = c.getConstructor(SenderCompID.getClass());
    Object xyz = con.newInstance(value);

    if (xyz instanceof SenderCompID) {
        message.setField((SenderCompID) xyz);
    } else if ( xyz instanceof TargetCompID ) {
        message.setField((TargetCompID) xyz);
    } else if …
}

有没有办法摆脱“if else”陈述?我要转换的类存储在String(key)中,我不能以某种方式使用地图中的键来强制转换它吗?

1 个答案:

答案 0 :(得分:0)

您可以使用Map Class作为键,然后使用Class<T>::cast功能删除if-else子句:

final Map<Class<? extends MyBaseClass>, String> map = new HashMap<Class<? extends MyBaseClass>, String>();

map.put(SenderCompID.class, "me"); // SenderCompID, TargetCompID are all subclasses of MyBaseClass

// ....

for (Map.Entry<Class<? extends MyBaseClass>, String> entry : hmap.entrySet()) {
    Class<? extends MyBaseClass> klass = entry.getKey();

    // your operations ...

    message.setField(klass.cast(xyz));
}