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 */
