gpt4 book ai didi

java - 是否可以使用反射来获取具体的实现类型(例如 Class)?

转载 作者:行者123 更新时间:2023-11-29 04:15:25 24 4
gpt4 key购买 nike

我的目标是将所有的静态类反射(reflect)到一个容器类中,收集到一个simpleName -> class的映射中。 .

这可以“手动”完成,没有问题,但我真的很想以编程方式完成。

例如,给定:

public interface MyInterface {
void doThing();
}

还有一个包含多个实现该接口(interface)的类的类

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

以下手动创建的 map 工作正常。

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

}

我可以将它用于有用的事情,例如使用 Gson 进行反序列化:

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

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

理想情况下,应该是这样的:

Map<String, Class<? extends MyInterface>> options = new HashMap<>();
for (Class<?> cls : MyStuff.class.getDeclaredClasses()) {
options.put(cls.getSimpleName(), cls)
}

但这不能编译,因为 getDeclaredClasses固定为 Class<?> .

有趣的是,Java 似乎拥有它在运行时所需的所有信息。我可以打印出每个类并查看它是 MyInterface 的正确实现类.我觉得我应该能够得到我需要的类型。但是,我无法弄清楚如何进行最后的编译时跳转以获得 Class<? extends MyInterface>

这在 Java 中可行吗?

最佳答案

如果您要求嵌套类实现 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
}

关于java - 是否可以使用反射来获取具体的实现类型(例如 Class<? extends MyInterface>)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com