scala reflection-Mirrors,ClassTag,TypeTag and WeakTypeTag
反射reflection是程序?qū)ψ陨淼臋z查、驗證甚至代碼修改功能。反射可以通過它的Reify功能來實時自動構(gòu)建生成靜態(tài)的Scala實例如:類(class)、方法(method)、表達式(expression)等?;蛘邉討B(tài)跟蹤當(dāng)前程序運算事件如:方法運算(method invocation)、字段引用(field access)等。反射又分編譯時段與運算時段反射即:compile-time-reflection及runtime-reflection。我們使用compile-time-reflection在編譯程序時指導(dǎo)編譯器修改編譯中代碼或者產(chǎn)生新的代碼,用runtime-reflection來進行實例的類型匹配、驗證等。在v2.10之前,Scala沒有自備的Reflection工具庫,只能用Java Reflection庫提供的部分功能來動態(tài)檢驗類型(class)或?qū)ο螅╫bject)及使用它們的字段(member access)。但java-reflection無法提供對某些scala項目的支持如:function、trait以及特殊類型如:existential、high-kinder、path-dependent、abstract types。特別是java-reflection無法獲取泛類型在runtime過程中的信息,這個一直是一個詬病。直到scala2.10增加了新的reflection庫才從根本上解決了針對scala特性的反射(refective)功能問題。scala-reflection同樣提供了compile-time-reflection和runtime-reflection。其中compile-time-reflection是通過獨立的macro庫實現(xiàn)的。在這篇討論里我們主要介紹runtime-reflection功能。
scala runtime-reflection有以下幾項主要功能:
1、動態(tài)檢驗對象類型,包括泛類型
2、實時構(gòu)建類型實例
3、實時調(diào)用類型的運算方法
反射功能可以在兩種環(huán)境下體現(xiàn):compile-time及runtime,是通過反射庫的universe命名空間分辨的,即:
runtime-reflection : scala.reflect.runtime.universe
compile-time-reflection: scala.reflect.macros.universe
我們必須import相應(yīng)的命名空間來獲取compile-time或runtime反射功能。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26