scala的反射
scala的反射分为 运行时反射和编译时反射。编译时反射在scala语言中使用宏来替代,它是开发程序转化器和生成器的神兵利器,而运行时反射通常用来作为调整语言语义和组件之间的绑定。
具体的情况请参考官方链接 - 点击进入这是官网中的例子和对scala反射的一些解释。顺便提醒一下最好不要和java反射混用一面造成不可控制的错误。
package myreflect
import scala.reflect.runtime.universe._
class Person(name:String,age:Int){
def printPerson={
println(s"${name}<-//->${age}")
}
}
object foo{
def main(args:Array[String]):Unit ={
val a = typeTag[Person]
getInstance[Person](a)
}
def getInstance[T](t:TypeTag[T]):Unit = {
val classSymbol = t.tpe.typeSymbol.asClass
val mirror = runtimeMirror(getClass.getClassLoader)
val classMirror = mirror.reflectClass(classSymbol)
val methodConstructor = t.tpe.decl(termNames.CONSTRUCTOR).asMethod
val methodMirror = classMirror.reflectConstructor(methodConstructor)
val p = methodMirror("jack",12)
val methodx = t.tpe.decl(TermName("printPerson")).asMethod
val person1 = mirror.reflect(p)
val methodPrint = person1.reflectMethod(methodx)
methodPrint()
}
}
该Demo演示了如何使用scala获取一个类的构造方法和方法,其他的请参考官方链接