2

我有两个问题。首先,这是我通过反射实例化类构造函数的反射代码:

 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] 定义固定数量的这些转换器。它只是看起来有点丑陋。

第二:这会导致与案例类实例化有关的任何类型的内存泄漏吗?

4

0 回答 0