Assume I have one class defined as below
class[T : ClassTag](val x : Int, val y : T) {
}
I have a utility method to use reflection and constructor parameters and create instance
def createInstance[T : ClassTage](cls : Class[_]) {
val m = universe.runtimeMirror(getClass.getClassLoader)
val clsSymbol = m.classSymbol(cls)
val cm = m.reflectClass(clsSymbol)
val ctorC = clsSymbol.toType.declaration(universe.nme.CONSTRUCTOR).asMethod
val ctorm = cm.reflectConstructor(ctorC)
val fullParams = ctorm.symbol.paramss
constructorFullParams.foreach(map => {
map.foreach(param => {
val name = param.name.decodedName.toString
val ptype = param.typeSignature
if (ptype.toString == "scala.reflect.ClassTag[T]") {
//dosth()
}
})
})
}
如上所示,我只使用类型字符串值来确定类型是否为ClassTag,然后调用dosth()方法。虽然看起来不太好看。有没有更好的方法来检查?
感谢。
答案 0 :(得分:0)
您可以通过typeOf
制作,考虑下一个代码快照:
import scala.reflect.runtime.universe._
class C[I]
class A[T: TypeTag] {
val tpe = typeOf[T]
}
val map = new A[Integer]
val typeC = new A[C[String]]
println(map.tpe)
println(typeC.tpe)