import scala.reflect.runtime.universe
import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe.typeOf
class Person(val name: String, val age: Int){
def myPrint(): Unit ={
println(name + "," + age)
}
}
object ReflectTest {
def main(args: Array[String]): Unit = {
// 1.获得当前JVM的所有类的反射
val rm: universe.Mirror = universe.runtimeMirror(getClass.getClassLoader)
// 2.生成一个Person实例
val person: Person = new Person("xiaomei", 23)
// 3.根据person实例生成一个反射
val instanceMirror: universe.InstanceMirror = rm.reflect(person)
// 3.1.根据反射,获得name成员的信息,并指定asTerm类型的符号
val nameTermSymbol: universe.TermSymbol = typeOf[Person].decl(TermName("name")).asTerm
// 3.2.根据上一步的符号,从Person的实例镜像中,取出一个成员符号
val nameMirror: universe.FieldMirror = instanceMirror.reflectField(nameTermSymbol)
// 3.3.通过get方法访问成员信息
println(nameMirror.get)
// 3.4.通过set方法, 改变成员信息
// 即便是val, 在反射中也可以改变
nameMirror.set("xiaoqiang")
println(nameMirror.get)
// 3.5根据反射,获得myPrint成员的信息,并指定asMethod类型的符号
val myPrintTermSymbol: universe.MethodSymbol = typeOf[Person].decl(TermName("myPrint")).asMethod
// 3.6.根据上一步的符号,从Person的实例镜像中,取出一个成员符号
val myPrintMirror: universe.MethodMirror = instanceMirror.reflectMethod(myPrintTermSymbol)
// 3.7.调用反射的方法
myPrintMirror()
}
}
【大数据开发】Scala——反射机制
最新推荐文章于 2022-05-29 15:53:14 发布