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

标签 java reflection

我的目标是将所有的静态类反射(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/

相关文章:

java - 实体类可以在没有对表的所有列进行定义的情况下工作吗

java - 点击后退按钮转到jsp页面

c# - 线程可以作为另一个用户执行吗? (.NET 2.0/3.5)

java - 比较两个类并考虑原始类及其包装类,看看它们是否相等

c# - 如何在 C# 中获取所有已加载类型的列表?

java - 在回收 View 中执行过滤时,屏幕上的数据显示不正确

Java:替换窗口左上角的咖啡杯图标

c# - 我如何反射(reflect)动态对象的成员?

java - 如何在 Windows 上远程启动 Tomcat

reflection - 如何在 Dart 中从 String 创建闭包?