最近想用scala写一个分布式爬虫框架。没有反射就没有框架。所以需要准备下scala反射的知识
- 什么是反射?
反射是程序的一种自省能力。利用反射可以从更高的抽象等级写程序甚至在运行时改变程序本身
- 反射有哪些类型?
根据使用的时机不同,可以分为:运行时反射,编译时反射,具体化反射(reification)
- scala 从什么时候开始提供了反射API ?
Scala 2.10
- scala反射API的入口类是什么?
Universe
- 主要的实现类有哪些?
Types
Symbols
Trees
Names
Annotations
Constants
Positions
FlatSet
- Imports
import scala.reflect.runtime.universe
import scala.reflect.runtime.universe._
- 镜子类(Mirrors)
通过Mirrors获取反射提高的信息。有不同的Mirrors,比如:Classloader Mirrors, Invoker Mirrors
ReflectiveMirror
loading sysbols by name
entry point to invoker mirrors
InstanceMirror
creating Invoker Mirrors
MethodMirrors
invoking instance methods
ClassMirror
creating invoker mirrors for constructors
ModuleMirror
getting singleton instances of objects
FiledMirror
getting/settign instance fields
- 符号(Symbols):你去想吧,源码中有的符号,反射都需要看得到
从name到它表示的entity的一个映射
TypeSymbol,比如 type,class, trait declarations
TermSymbol,比如val, var, def, object declarations
- 通过反射调用构造函数的例子(比Java复杂多了!!scala纠结人的地方不只这一个)
package hum.yishu.s4w.json object RefTest extends App { import scala.reflect.runtime.universe import scala.reflect.runtime.universe._ case class MyClass(x: Int) val myRuntimeMirror: RuntimeMirror = universe.runtimeMirror(getClass.getClassLoader) val classSymbol: ClassSymbol = typeOf[MyClass].typeSymbol.asClass val classMirror: ClassMirror = myRuntimeMirror.reflectClass(classSymbol) val methodSymbol: MethodSymbol = typeOf[MyClass].decl(universe.termNames.CONSTRUCTOR).asMethod val constructorMethod: MethodMirror = classMirror.reflectConstructor(methodSymbol) val res = constructorMethod(4) println(res) // MyClass(4) } // Mirror + Symbol => Mirror 记住这个模式