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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM