我的目标是在容器类中反映所有静态类,并将它们收集到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中这可能吗?
答案 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
}