Scala进阶之路-反射(reflect)技术详解
Scala进阶之路-反射(reflect)技术详解
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
Scala中的反射技术和Java反射用法类似,我这里就不一一介绍反射是啥了,如果对Java的反射感兴趣的话可以参考我之前分享的笔记:https://www.cnblogs.com/yinzhengjie/p/9272289.html。好了,废话不多说,我们直接上一个Scala的案例。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaReflect 7 8 class Person(name:String,age:Int) { 9 def sayHello() = { 10 println(s"Hi,I'm ${name},Nice to meet you!") 11 } 12 13 def palyGame(msg:String) = { 14 println(s"${name} 正在玩《${msg}》,这局已经拿下了8次五杀了.......") 15 } 16 17 18 override def toString: String = { 19 s"姓名:${name},年龄:${age}" 20 } 21 22 } 23 24 25 object PersonDemo { 26 def main(args: Array[String]): Unit = { 27 //得到JavaUniverse用于反射(获取Environment和universe) 28 val ju = scala.reflect.runtime.universe 29 //得到一个JavaMirror,用于反射Person.class(获取对应的Mirrors,这里是运行时的) 30 val mirror = ju.runtimeMirror(getClass.getClassLoader) 31 //得到Person类的Type对象后,得到type的特征值并转为ClassSymbol对象 32 val classPerson = ju.typeOf[Person].typeSymbol.asClass 33 //用Mirrors去reflect对应的类,返回一个Mirrors的实例,而该Mirrors装载着对应类的信息 34 val classMirror = mirror.reflectClass(classPerson) 35 //得到构造器方法 36 val constructor = ju.typeOf[Person].decl(ju.termNames.CONSTRUCTOR).asMethod 37 //得到MethodMirror 38 val methodMirror = classMirror.reflectConstructor(constructor) 39 /** 40 * Scala通过反射实例化对象 41 */ 42 val p = methodMirror("yinzhengjie",18) 43 println(p.toString) 44 45 /** 46 * Scala通过反射调用方法 47 */ 48 val instanceMirror = mirror.reflect(p) 49 //得到Method的mirror 50 val mysayHelloMethod = ju.typeOf[Person].decl(ju.TermName("sayHello")).asMethod 51 val mypalyGameMethod = ju.typeOf[Person].decl(ju.TermName("palyGame")).asMethod 52 //通过Method的Mirror索取方法 53 val mysayHello = instanceMirror.reflectMethod(mysayHelloMethod) 54 val mypalyGame = instanceMirror.reflectMethod(mypalyGameMethod) 55 //调用我们自定义的方法 56 mysayHello() 57 mypalyGame("英雄联盟") 58 59 /** 60 * Scala通过反射访问属性 61 */ 62 val nameField = ju.typeOf[Person].decl(ju.TermName("name")).asTerm 63 val name = instanceMirror.reflectField(nameField) 64 println("通过反射得到name的值为:"+name.get) 65 } 66 } 67 68 69 /* 70 以上代码执行结果如下: 71 姓名:yinzhengjie,年龄:18 72 Hi,I'm yinzhengjie,Nice to meet you! 73 yinzhengjie 正在玩《英雄联盟》,这局已经拿下了8次五杀了....... 74 通过反射得到name的值为:yinzhengjie 75 */
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎交流学习技术交流,个人微信: "JasonYin2020"(添加时请备注来源及意图备注)
作者: 尹正杰, 博客: https://www.cnblogs.com/yinzhengjie/p/9385123.html