可以使用反射来获取具体的实现类型(例如Class <!-?扩展MyInterface->)吗?

时间:2018-10-08 18:45:05

标签: java reflection

我的目标是在容器类中反映所有静态类,并将它们收集到Property 'url' does not exist on type 'PrismicImage'. Property 'url' does not exist on type '{}' 的映射中。

这可以毫无问题地“手工”完成,但是我真的很想通过编程来完成。

例如,给定:

simpleName -> class

还有一个包含几个实现该接口的类的类

public interface MyInterface {
    void doThing();
}

以下手动创建的地图可以正常运行。

public class MyStuff {
    public static class One implements MyInterface {...}
    public static class Two implements MyInterface {...}
    public static class Three implements MyInterface {...}
}

我可以将其用于Gson反序列化等有用的事情:

public void demo(String jsonString) {
    Map<String, Class<? extends MyInterface>> myMap = ImmutableMap.of(
        "One", One.class,
        "Two", Two.class,
        "Three", Three.class,
    )

}

现在,我想做的不是手动构建该地图,而是使用反射来构建它。

理想情况是:

MyInterface object = new Gson().fromJson(jsonString, myMap.get("One"))

但是,由于Map<String, Class<? extends MyInterface>> options = new HashMap<>(); for (Class<?> cls : MyStuff.class.getDeclaredClasses()) { options.put(cls.getSimpleName(), cls) } 已固定为getDeclaredClasses,因此无法编译。

有趣的是,Java似乎具有运行时所需的所有信息。我可以打印出每个类,看看它是Class<?>的正确实现类。我觉得我应该能够获得所需的类型。但是,我不知道如何进行最后的编译时跃点以获得MyInterface

在Java中这可能吗?

1 个答案:

答案 0 :(得分:3)

如果您要求嵌套类实现MyInterface,则应进行检查,一旦完成,就可以安全地强制转换值。

private static Map<String, Class<? extends MyInterface>> buildOptions() {
    Map<String, Class<? extends MyInterface>> options = new HashMap<>();
    for (Class<?> cls : MyStuff.class.getDeclaredClasses()) {
        if (MyInterface.class.isAssignableFrom(cls)) {
            options.put(cls.getSimpleName(), cls.asSubclass(MyInterface.class));
        }
    }
    return Collections.unmodifiableMap(options); // Make it immutable
}