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

时间:2018-01-23 11:43:44

标签: scala implicit implicit-parameters

我有一个像这样声明的类:

class XYZ(implicit sys: ActorSystem) extends Enricher {

}

在函数中,我使用类的名称(这里:className)实例化类。

我试着这样做:

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

asSubclass classOf [Enricher]

 clazz.newInstance()

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

我该怎么做?

1 个答案:

答案 0 :(得分:1)

如果你抓住正确的构造函数,你可以显式传递参数。 如果您知道只有一个构造函数,那么您可以这样做:

 clazz.getConstructors.head.newInstance(sys)

如果有几个,你将不得不遍历它们,寻找一个,其参数的数量和它们的类型与你拥有的相匹配。

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