我有两个问题。首先,这是我通过反射实例化类构造函数的反射代码:
case class RowToScalaConverter[T: TypeTag]() {
private val tpe: _root_.scala.reflect.runtime.universe.Type = typeOf[T]
private val symbol: _root_.scala.reflect.runtime.universe.ClassSymbol = tpe.typeSymbol.asClass
private val classLoaderMirror = runtimeMirror(getClass.getClassLoader)
private val classMirror: _root_.scala.reflect.runtime.universe.ClassMirror = classLoaderMirror.reflectClass(symbol)
private val constructorSymbol: _root_.scala.reflect.runtime.universe.Symbol = tpe.decl(termNames.CONSTRUCTOR)
private val constructorMethod: _root_.scala.reflect.runtime.universe.MethodMirror = classMirror.reflectConstructor(constructorSymbol.asMethod)
private def build(args: Seq[_]): T = constructorMethod(args: _ *).asInstanceOf[T]
def rowToClass(row: Row): T = {
val args = getRowArgs(row)
print(args)
build(args)
}
}
(Ps,我很清楚这不是类型安全的,这对我来说没问题,但这是我能做的最好的事情)
第一个问题:有没有更清洁的方法来做到这一点?似乎有很多样板。我不太担心线程安全,因为我计划在运行时为某个类 [T] 定义固定数量的这些转换器。它只是看起来有点丑陋。
第二:这会导致与案例类实例化有关的任何类型的内存泄漏吗?