动态实例化实现接口并调用接口方法的类

Posted

技术标签:

【中文标题】动态实例化实现接口并调用接口方法的类【英文标题】:Dynamically instantiate classes which implement an interface and invoke interface method 【发布时间】:2017-08-21 20:05:24 【问题描述】:

我有一个接口LogParser,由一个方法parse(String x) 组成。我还有一个 ArrayList,其中包含所有实现 LogParser 的多个类的名称。是否可以遍历这个类名列表并动态实例化它们各自的类并调用parse(String x)

我遇到的问题是这些类没有零参数构造函数,所以我经常遇到 InstantiationException,试图通过反射调用 parse 方法。

谢谢!

【问题讨论】:

【参考方案1】:

如果实现类型没有构造函数,那会很痛苦。最简单的方法可能是使用像 Spring 或 Guice 这样的依赖注入框架。

在 Spring 中,你可以只注入一个 List<LogParser>,你会得到所有已知的实现:

@Autowired
private List<LogParser> parsers;

当然,现在您必须将每个 LogParsers 分别定义为 Spring bean。

其他框架也有类似的功能。

【讨论】:

【参考方案2】:

你必须调用一些构造函数来有效地实例化一个对象。您使用反射来获取构造函数的Method,然后用它进行实例化。见Instantiate a class object with constructor that accepts a string parameter?。我没有关闭重复,因为您还有一个问题:您知道您所有的类都有一个具有相同签名的构造函数吗?

【讨论】:

以上是关于动态实例化实现接口并调用接口方法的类的主要内容,如果未能解决你的问题,请参考以下文章

█■为啥要用实现接口的类实例化接口呢?

C#为啥接口可以实例化一个实现该接口的类?

类继承接口使用接口实例化 与 使用类实例化

一个类实现两个接口,如何用spring实例化

接口可以实例化吗

java类和接口的区别