Вот в чем проблема.
trait TestTrait[T, R] extends (T => R)
// Class implementing TestTrait. This is one class, there are a number of class implementing TestTrait
class TestClass(val input: Map[String, String])extends ConfigurableDomainExtractor[String, String] {
override def apply(value: String): String = ???
}
// Companion Object
object TestClass {
def apply(properties: Map[String, String]): TestClass = TestClass(properties)
}
то, что я хочу сделать, это определить метод в классе util, скажем,
class CreateInstance {
def getInstance(fullyQualifiedClassName: String, properties: Map[String, String]): TestTrait = ???
// fullyQualifiedClassName is the name of the class that needs to be instantiated using its companion object. It can be TestClass or any class implementing TestTrait
// properties is the map that needs to be pass to the apply method of the companion object.
}
который при передаче имени класса сгенерирует объект того же класса, сначала получив сопутствующий объект, а затем вызовет apply для сопутствующего объекта, передавая карту, чтобы сгенерировать экземпляр класса.
Я знаю, что у нас есть отражения в scala, и я пробовал несколько вещей, но безуспешно. Вот несколько вещей, которые я пробовал.
import scala.reflect.runtime.universe
def getInstance(fullyQualifiedClassName: String, properties: Map[String, String]): TestTrait = {
val runtimeMirror = universe.runtimeMirror(getClass.getClassLoader)
val module = runtimeMirror.staticModule(fullyQualifiedClassName)
val obj = runtimeMirror.reflectModule(module)
obj.instance
.asInstanceOf[TestTrait[String, String]]
.apply(properties)
.asInstanceOf[TestTrait[String, String]]
}
Может кто поможет доделать def getInstance
метод. ?