概述
Scala 的反射分为两个范畴:
运行时反射:通常意义上的反射
编译时反射:宏,或者元编程
这两者之间的区别在于Environment, 而Environment又是由universe决定的. 反射的另一个重要的部分就是一个实体集合,而这个实体集合被称为mirror,有了这个实体集合我们就可以实现对需要反射的类进行对应的操作,如属性的获取,属性值得设置,以及对反射类方法的调用(其实就是成员函数的入口地址, 但请注意, 这只是个地址)!
可能有点绕, 说的直白点就是要操作类方法或者属性就需要获得指定的mirror,而mirror又是从Environment中得来的,而Environment又是Universes中引入的,而Universes根据运行时和编译时又可以分为两个领域的.
Universes
Universes有两类,运行时和编译时。提供了反射时要用的主要概念。such as Types, Trees, and Annotations。
- scala.reflect.runtime.universe for runtime reflection
- scala.reflect.macros.Universe for compile-time reflection.
Environment
Environment就是运行时和编译时两种环境
Mirrors
镜像层级:
- ClassLoaderMirror
- ClassMirror ( => 类)
-
- MethodMirror ( 只有构造函数)
-
- InstanceMirror ( => 实例)
-
- MethodMirror(方法)
-
- FieldMirror(属性)
-
- ModuleMirror ( => Object)
-
- instance: Any (单例类)
-
镜像使用
Mirrors 提供了反射时要操作的实体(内存中的实体)。
mirror分两大类:
“Classloader” mirrors : 通过staticClass/staticModule/staticPackage方法把变量转为符号。
“Invoker” mirrors : 用于产生方法调用。是由 classloader mirror创建。包括:InstanceMirror,
MethodMirror,FieldMirror,ClassMirror 和 ModuleMirror。
Classloader入口
- 镜像的入口通过runtimeMirror()获得。runtimeMirror 的返回值就是一个 classloader mirror。它是一个ReflectiveMirror。可以通过名字加载符号。
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> val mirror