从类名字符串中获取TypeTag



简单的问题,如何从类名中获得TypeTag ?

基本上在Java中TypeTag相当于Class.forName

注意:Manifest在这里不适合我,我需要一个TypeTag。虽然如果有从清单到类型标签的方法,那也可以工作,因为我可以从classname获得一个清单。

manifest已被弃用,可能会在未来的Scala版本中消失。我认为依靠他们是不明智的。你可以只使用新的Scala反射来做你想做的事情。

您可以从字符串转到Class以获得它的类装入器,然后可以通过镜像从Class创建TypeTag,正如本回答中概述的那样。下面是一段稍微修改过的代码来演示它:

import scala.reflect.runtime.universe._
import scala.reflect.api
def stringToTypeTag[A](name: String): TypeTag[A] = {
  val c = Class.forName(name)  // obtain java.lang.Class object from a string
  val mirror = runtimeMirror(c.getClassLoader)  // obtain runtime mirror
  val sym = mirror.staticClass(name)  // obtain class symbol for `c`
  val tpe = sym.selfType  // obtain type object for `c`
  // create a type tag which contains above type object
  TypeTag(mirror, new api.TypeCreator {
    def apply[U <: api.Universe with Singleton](m: api.Mirror[U]) =
      if (m eq mirror) tpe.asInstanceOf[U # Type]
      else throw new IllegalArgumentException(s"Type tag defined in $mirror cannot be migrated to other mirrors.")
  })
}

您可以使用Class.forNameString中获得Class, ManifestFactory.classTypeClass中获得Manifest,然后scala.reflect.runtime.universe.manifestToTypeTag获得TypeTag:

import scala.reflect.runtime.universe
import scala.reflect.ManifestFactory
val className = "java.lang.String"
val mirror = universe.runtimeMirror(getClass.getClassLoader)
val cls = Class.forName(className)
val t = universe.manifestToTypeTag(mirror,
                                   ManifestFactory.classType(cls))

相关内容

  • 没有找到相关文章

最新更新