0

我有一个这样声明的类:

class XYZ(implicit sys: ActorSystem) extends Enricher {

}

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

我试着这样做:

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

asSubclass classOf[Enricher]

 clazz.newInstance()

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

我该怎么做?

4

1 回答 1

2

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

 clazz.getConstructors.head.newInstance(sys)

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

 clazz
   .getConstructors
   .filter { _.getParameterTypes.size == 1 }
   .find { 
     _.getParameterTypes.head.isAssignableFrom(classOf[ActorSystem])
   }.newInstance(sys)
于 2018-01-23T11:52:10.827 回答