Scala反射

最近想用scala写一个分布式爬虫框架。没有反射就没有框架。所以需要准备下scala反射的知识


  1. 什么是反射?

    反射是程序的一种自省能力。利用反射可以从更高的抽象等级写程序甚至在运行时改变程序本身

  2. 反射有哪些类型?

    根据使用的时机不同,可以分为:运行时反射,编译时反射,具体化反射(reification)

  3. scala 从什么时候开始提供了反射API ?

    Scala 2.10

  4. scala反射API的入口类是什么?

    Universe

  5. 主要的实现类有哪些?

    Types

    Symbols

    Trees

    Names

    Annotations

    Constants

    Positions

    FlatSet

  6. Imports

    import scala.reflect.runtime.universe

    import scala.reflect.runtime.universe._

  7. 镜子类(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

  8. 符号(Symbols):你去想吧,源码中有的符号,反射都需要看得到

    从name到它表示的entity的一个映射

    TypeSymbol,比如 type,class, trait declarations

    TermSymbol,比如val, var, def, object declarations

  9. 通过反射调用构造函数的例子(比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  记住这个模式


你可能感兴趣的:(scala,反射)