如何在需要隐式参数的 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)
我有一个 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)