scala反射详解

概述

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入口
  1. 镜像的入口通过runtimeMirror()获得。runtimeMirror 的返回值就是一个 classloader mirror。它是一个ReflectiveMirror。可以通过名字加载符号。
scala>   import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala>   val mirror 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值