【问题标题】: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 方法。

谢谢!

【问题讨论】:

    标签: java reflection interface invoke


    【解决方案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?。我没有关闭重复,因为您还有一个问题:您知道您所有的类都有一个具有相同签名的构造函数吗?

      【讨论】:

        猜你喜欢
        • 2020-02-20
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        相关资源
        最近更新 更多