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

莫哈·德哈吉(Moha Dehaji)

我的目标是在容器类中反映所有静态类,并将它们收集到的映射中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 {...}
}

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

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<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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何定义接口的对象数组?myData:Array<myInterface>=[]; 我在“myInterface[]”类型上不存在属性“xxxxxx”

我可以使用反射来获取已通过new关键字覆盖的基本属性吗?

我可以使用反射来调用方法的超级方法吗?

您可以使用反射来查找当前正在执行的方法的名称吗?

我可以使用反射来发现Java类声明的内部类吗?

方法可以使用Java中的反射来弄清楚自己的名称吗

您可以使用Golang反射来初始化指针变量吗?

我可以使用反射来检测控件对透明背景的支持吗?

将两种类型的对象添加到 mutableListOf<MyInterface>()

对 ArrayList<MyInterface> 进行排序

可以使用泛型类型实现Flink的AggregateFunction吗?

在Golang类型断言中可以使用反射数组类型吗?

“公共接口MyInterface <T扩展MyInterface <T >> {...}”的含义

我可以使用序列化为json字符串并浏览它,而不是使用反射来遍历类的属性?它有什么缺点吗?

我可以使用强类型反射找到具有通用参数的方法吗?

我可以在代码的静态部分中使用Google反射来查找子类吗?

我可以使用Java反射获取方法参数名称吗?

我可以使用Java反射获取有关局部变量的信息吗?

Acumatica 自定义:我可以使用反射获取缓存中字段的值吗?

我可以使用Java反射获取方法字段名称吗?

可以使用反射按顺序使用getMethods吗?

框架/库可以使用MethodHandle(而不是传统的反射)吗?

可以使用反射获得类中的瞬态场吗

可以使用CSS将图像反射为阴影吗?

TS2740类型由于使用TypeScript应用程序的React Native中的ReadOnly <MyInterface>错误而缺少以下属性

我可以仅使用类型而不是具体变量来获取Rust数组的长度吗?

库的单独文件中的MyInterface和MyImplementation

基类实现INotifyPropertyChanged:派生类型可以使用其PropertyChanged事件吗?

类型构造函数可以使用与类型相同的别名吗?