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  记住这个模式
时间: 2024-11-08 09:51:15

Scala反射的相关文章

joda time 与 jackson

joda time 据称是 jdk1.8 以前最好的时间系统,我觉得 joda time 的确比 java 自带的时间系统好用.java 自带的时间系统需要花很大的功夫来处理格式的问题,time 与 calendar 也没结合到一起,印象中,每次处理时间问题起码要写三行代码.因用 asyn mysql db 引入 joda time,但在 joda time 与 json 的序列化和非序列化时遇到了问题. val res = Tag(new LocalDate, "id", "

scala的反射

??如果当初Scala没有选择基于Jvm,那么Scala是否还能取得今天的成就吗?Jvm为Scala带了稳健强大的性能,同时也无法避免类型擦除的约束. ??作为Jvm上的先进语言,Scala在生成字节码时,编译器附加了额外的类型信息,及时class的泛型参数被擦除了,scala仍然可以获取泛型信息. 主要存在三种api: TypeTag,可获取一个类型的全部信息,包括高阶类型,比如List[List[List[String]]]类型. ClassTag,可获取类型的部分信息.ClassTag[L

[转载] 详述三种现代JVM语言--Groovy,Scala和Clojure

转载自http://www.tuicool.com/articles/jYzuAv和http://www.importnew.com/1537.html 在我与Martin Fowler曾经合作呈现的一次主题演讲中,他作出了一个有洞察性的观点: Java的遗产将是平台,而不是程序设计语言. Java技术的原始工程师们作出了一个明智的决定,就是将编程语言与运行时环境分开,最终这使得超过200种语言能够运行在Java平台上.这种架构对于该平台的长期活力是至关重要的,因为计算机程序设计语言的寿命一般都

Scala Structural Typing结构类型

鸭子类型:"当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子." 一般在动态语言里面才有,因为静态语言是强类型的,会在编译期检查类型,很难实现.但是Scala作为一门static type语言,居然支持,不得不说Scala确实很强大.直接上code package testscala object StructuralTyping extends App { def quacker(duck: {def quack(value: String): S

Scala之Object (apply) dycopy

一.前言 前面学习了Scala的Methods,接着学习Scala中的Object 二.Object Object在Scala有两种含义,在Java中,其代表一个类的实例,而在Scala中,其还是一个关键字,本篇首先将会把object当成一个类的实例看待,展示如何将对象从一种类型转化为另一种类型,之后将展示如何创建单例对象,Scala中还存在包对象,在Scala中,经常有如下定义 type Throwable = java.lang.Throwable type Exception = java

Scala 枚举: Enumeration 概述

Spark Scala 枚举 * Java 中的那套枚举并不能直接使用到 Scala 中* Scala 中的枚举使用轻量级 Enumeration 进行实现* Scala 中的枚举其实是一个伴随对象* Scala 中的枚举没有方法重写功能* Scala 中的枚举其实都是 Enumeration.Value 这个对象 和Java和C++不同,Scala并没有枚举类型.不过,Spark标准类库提供了一个 Enumeration类型,可以用于生成枚举,定义一个枚举类的对象,并以Value方法调用枚举中

scala简要:高级函数和高级类型

在scala中,函数是头等公民,可以用变量存储函数,可以使用匿名函数,和带参数的函数.如果需要一个序列的值,一般从一个简单序列转化得出.函数可以在变量不再作用域内时被调用,这样的函数叫闭包. 柯里化是指将原来接受两个参数变成接受一个参数的函数的过程.不需要用return语句来返回函数值,函数的返回值就是函数体的值. scala中,用方括号来定义类型参数,从调用该方法的实际参数来推断出类型.视图界定 T<%V要求必须存在一个从T到V的隐式转换,Manifest对象是构造器的隐式参数,可用于上下文界

(升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课程会涵盖Scala编程详解.Spark核心编程.Spark SQL和Spark Streaming.Spark内核以及源码剖析.性能调优.企业级案例实战等部分.完全从零起步,让学员可以一站式精通Spark企业级大数据开发,提升自己的职场竞争力,实现更好的升职或者跳槽,或者从j2ee等传统软件开发工程

Scala 摘要

读<快学Scala >一书的摘要 Scala 运行于JVM之上,拥有海量类库和工具,兼顾函数式编程和面向对象. 在Scala中, 解释器就是我们喜欢的REPL,变量或者函数的类型总是写在变量或函数的后面(与java相反),数值类型的转换通过方法而不是强制类型转换,仅当同一行代码存在多条语句时才需要用分号隔开. scala 允许自定义操作符,注意有分寸地使用,在使用scala.开头的包时,可以省去scala前缀.scala没有静态方法,类似的特性可以用单例对象,一个类对应的companion o