【发布时间】:2020-05-20 10:51:27
【问题描述】:
我有一些旧代码,如下所示:
Set<Class<? extends Foo>> classes = reflections.getSubTypesOf(Foo.class);
for (Class<? extends Foo> cl : classes) {
Foo<?, ?> foo = cl.newInstance();
// use foo
}
我想添加另一个接口:
interface NewFoo extends Foo {...}
但随后它尝试在 NewFoo 上调用 newInstance。目前我的解决方案是这样的:
try {
Foo<?, ?> foo = cl.newInstance();
// use foo
} catch (InstantiationException ignore) {
}
但我想知道是否有更好的方法?当我手上有一个 Class 对象时,我可以区分接口和类吗?
【问题讨论】:
-
请注意,对于没有无参数构造函数的类,您的“解决方案”会失败。
-
对于长期解决方案,我建议查看
ServiceLoader和基本概念。必须声明预期的实现作为自动发现可能看起来不太舒服,另一方面,它不承担自动使用已找到的任何匹配类的危险。而且它是获取不为反射开放的不同模块的实现实例的唯一干净解决方案。
标签: java class reflection interface