如何在需要隐式参数的 Scala 中按名称实例化 class?

How to instantiate a class by name in Scala which requires an implicit parameter?

我有一个 class 声明如下:

class XYZ(implicit sys: ActorSystem) extends Enricher {

}

在函数中,我使用 class 的名称实例化 class(此处:className)。

我试过这样做:

 val clazz = Class.forName(className, true, getClass.getClassLoader) 

asSubclass classOf[Enricher]

 clazz.newInstance()

但这只有在构造函数不需要任何参数时才有效。

我该怎么做?

如果你抓住了正确的构造函数,你可以明确地传递参数。 如果你知道只有一个构造函数,你可以这样做:

 clazz.getConstructors.head.newInstance(sys)

如果可以有多个,您将不得不遍历它们,寻找一个参数数量和类型与您所拥有的相匹配的参数。

 clazz
   .getConstructors
   .filter { _.getParameterTypes.size == 1 }
   .find { 
     _.getParameterTypes.head.isAssignableFrom(classOf[ActorSystem])
   }.newInstance(sys)