`

scala运行时反射简单介绍

阅读更多

本文来自:fair-jm.iteye.com 转截请注明出处

 

看了些官网的文档 做点简单的总结

scala的类型系统比java要丰富点 但scala的运行时反射感觉比java的要难用

 

运行期反射的作用:

观察对象的类型 包括泛型

实例化一个对象

 

访问或者调用对象的成员

 

要使用运行期反射的相关工具的话 导入以下的包:

import scala.reflect.runtime.universe._

 

TypeTags:由编辑器生成

 

只能通过隐式参数或者上下文绑定获取

可以有两种方式获取:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

//使用typeTag
scala> def getTypeTag[T:TypeTag](a:T) = typeTag[T]
getTypeTag: [T](a: T)(implicit evidence$1: reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.TypeTag[T]

//使用implicitly 等价的 
//scala>def getTypeTag[T:TypeTag](a:T) = implicitly[TypeTag[T]]

scala> getTypeTag(List(1,2,3))
res0: reflect.runtime.universe.TypeTag[List[Int]] = TypeTag[List[Int]]

 

通过TypeTag的tpe方法获得需要的Type(如果不是从对象换取Type 而是从class中获得 可以直接用 typeOf[类名])

得到Type之后 就可以have fun了

 

declarations可以得到所有的信息

 

是一个MemberScope

 

用 universe下的runtimeMirror 返回运行期所有的类:

scala> runtimeMirror(getClass.getClassLoader)
res6: reflect.runtime.universe.Mirror = JavaMirror with scala.tools.nsc.interpreter.IMain$TranslatingClassLoader@189c091e of type class scala.tools
.nsc.interpreter.IMain$TranslatingClassLoader with classpath [(memory)] and parent being scala.tools.nsc.util.ScalaClassLoader$URLClassLoader@2c1a9
d31 of type class scala.tools.nsc.util.ScalaClassLoader$URLClassLoader with classpath [file:/E:/java/jdk1.7.0_51/jre/lib/resources.jar,file:/E:/jav
a/jdk1.7.0_51/jre/lib/rt.jar,file:/E:/java/jdk1.7.0_51/jre/lib/jsse.jar,file:/E:/java/jdk1.7.0_51/jre/lib/jce.jar,file:/E:/java/jdk1.7.0_51/jre/lib
/charsets.jar,file:/E:/java/jdk1.7.0_51/jre/lib/jfr.jar,file:/E:/java/jdk1.7.0_51/jre/lib/ext/access-bridge-64.jar,file:/E:/java/jdk1.7.0_51/jre/li
b/ext/dnsns.jar,file:/E:/java/jdk1.7.0_51/jre/lib/ext/jaccess....

 

 

Universe的种类:

1scala.reflect.runtime.universe 运行时的反射

2scala.reflect.marcos.universe编译期的反射

 

Mirrors的种类:

1classloader等级的mirrors

staticClass staticModule staticPackage

2、调用级别的mirrors

MethodMirror.apply FieldMirror.getset

 

运行期的mirror:

runtimeMirror(<classloader>)(通过runtime.universe)

得到scala.reflect.api.JavaMirrors#runtimeMirror

classloadermirror可以创造invokermirror

scala.reflect.api.Mirrors#InstanceMirror

scala.reflect.api.Mirrors#MethodMirror

scala.reflect.api.Mirrors#FieldMirror

scala.reflect.api.Mirrors#ClassMirror

scala.reflect.api.Mirrors#ModuleMirror

 

InstanceMirror是用来创建方法和属性的invoker mirrors

使用reflect(实例)得到

 

MethodMirror

用来访问实例的方法

可以用InstanceMirrorreflectMethod(MethodSymbol)得到

 

FieldMirror

用来访问属性(getting/setting)

可以用InstanceMirrorreflectField

 

ClassMirror

用来创建构造器的调用mirror

可以通过reflectClass(ClassSymbol)得到

 

ModuleMirror

用来访问单例Object

 

使用reflectModule(ModuleSymbol

 

获取Classsymbol TypetypeSymbol asClass

获取FiledMethodsymbol Typedeclaration 参数是newTermName("属性或方法名") asTerm(属性可能需要asTerm.accessed.asTerm

获取构造器的Typedeclaration 参数是nme.CONSTRUCTOR asMethod

 

获取ModuleTypetermSymbolasModule

 

本文来自:fair-jm.iteye.com 转截请注明出处

 

分享到:
评论

相关推荐

    sparknotebook, 在ipython中,使用 Scala 运行 Apache Spark的例子.zip

    sparknotebook, 在ipython中,使用 Scala 运行 Apache Spark的例子 sparknotebook重要我正处于删除 IScala的过程中,因为它的开发出现停滞。 我正在用 jupyter 替换它。 ,jupyter-scala还没有为 Scala 2.10构建。 ...

    hadoop scala spark 例子项目,运行了单机wordcount

    hadoop scala spark 例子项目,运行了单机wordcount

    Scala程序设计(第2版)

    24.3 Scala 的高级运行时反射API 458 24.4 宏 461 24.4.1 宏的示例:强制不变性 463 24.4.2 关于宏的最后思考 466 24.5 本章回顾与下一章提要 466 附录A 参考文献 468 作者简介 473 关于封面 ...

    portable-scala-reflect:Scala的平台独立反射

    便携式scala-reflect:与Scala无关的平台反射 Scala支持的各种平台(JVM,JavaScript和Native)对运行时反射的支持不同。 甚至跨平台支持的功能子集也通过不同的API公开。 该库公开了一个统一的可移植API,用于在...

    在浏览器上运行 Scala Scala.js.zip

    在浏览器上运行 Scala Scala.js ,Scala.js 是一个将 Scala 语言编译成 JavaScript 的工具,可以让你直接在浏览...

    scala习题精选100道附带解析

    scala习题精选100道,每道都有人工分析,技术点原理,不只是简单的答案

    scala编译器

    Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。它也能运行于Java ME, CLDC(Java Platform, Micro Edition Connected Limited Device Configuration)上。还有另一.NET平台的实现,不过该版本更新有些滞后...

    快学Scala 电子书 pdf

    花了5元订制的快学Scala pdf电子书! Scala是一门以Java虚拟机...Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。

    scala 2.13.3 API 文档 Html离线版 scala-api.rar

    最新制作 scala 2.13.3 API 文档 Html离线版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。...Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。

    快学Scala.中文完整版

    中文版scala。《快学Scala》是一门以Java虚拟机(JVM)为目标...Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。

    移植到 Scala.js 的 简单HTML5 Canvas游戏_Scala_代码_下载

    移植到 Scala.js 的简单 HTML5 Canvas 游戏 运行应用程序 $ sbt &gt; fastOptJS $ open index-dev.html

    scala-2.13.1.tgz

    Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。 本书适合有一定的Java编程经验、对Scala感兴趣,并希望尽快...

    快学Scala PDF扫描版

    Scala是一门以Java虚拟机(JVM)为目标运行环境并将面向对象和...Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。

    scala sdk scala-2.12.3

    scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3

    Salad:Scala宏和反射库

    使用Scala宏和反射的库。 例子 遍历类型结构 如果定义如下: package example trait SampleStructure { def x : Int def y : SampleGeneric [ String , Long , Int ] def z : List [ Int ] } trait ...

    scala + mybatis 数据库查询

    这是一个简单实用的scala集成mybatis数据库查询代码,简单明了

    Scala实用指南

    本书共分为 4 个部分:第一部分详细介绍 Scala 的一些基础知识,并和 Java 中的相关概 念进行了参照,方便读者快速上手 Scala;第二部分进一步介绍 Scala 的一些中级知识,以及 与 Java 的一些差异点,方便读者编写...

    快学 Scala.pdf

    Cay S.Horstmann所著的《快学...Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。 如果涉及侵权请联系作者删除,谢谢

    Scala函数式编程

    很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...

    scala中文教程(java 平台开发语言 scala 简单教程)

    但它展现了当把面向对象和函数型语言两种风格,技术地且很有品地混搭在一起时,就形成了 自然和强有力的组合。匹萨的设计成为了 Java泛型的基础,马丁的 GJ(Generic Java)编译 Java 1.3开始成为了 Sun 微系统的...

Global site tag (gtag.js) - Google Analytics