用Java反映地图

时间:2015-02-26 01:26:32

标签: java multithreading reflection hashmap

Java中,拥有共享存储空间:

final Map<String, Car> cars = (numberOfThreads == 1)
        ? new HashMap<String, Car>()
        : new ConcurrentHashMap<String, Car>();

然后在线程工作者类的run()方法中,我想将并发数据存储到cars映射中。为此,我需要向下转换为适当的hashmap实例。我可以使用if (numberOfThreads == 1),但我想可以反映cars对象 - 我如何在这里使用Java Reflection API?

我收到此错误:The method putIfAbsent(String, Car) is undefined for the type Map<String, Car>所以我不得不低估。

2 个答案:

答案 0 :(得分:3)

您问题的简单答案:

if (cars instanceof ConcurrentMap) {
    ((ConcurrentMap)cars).putIfAbsent(key, value);
}

但是,在Java 8中Map interface now has putIfAbsent(),因此如果您可以升级JDK,则不需要进行此转换。

如果您不能使用Java 8,我建议您始终使用ConcurrentMap,因为这种instanceof代码不值得权衡。

在任何情况下,Java反射API都不适合这种情况。

答案 1 :(得分:1)

你不需要向下转换,只需使用Map put方法,不需要做任何其他事情。

由于问题发生了变化,因此没有putIfAbsent方法。没有看到代码,人们只能猜测。

最后你确定你需要putIfAbsent,如果你把同一辆车放两次会有问题吗?