本文来自: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的种类:
1、scala.reflect.runtime.universe 运行时的反射
2、scala.reflect.marcos.universe编译期的反射
Mirrors的种类:
1、classloader等级的mirrors
staticClass staticModule staticPackage
2、调用级别的mirrors
MethodMirror.apply FieldMirror.get(set)
运行期的mirror:
runtimeMirror(<classloader>)(通过runtime.universe)
得到scala.reflect.api.JavaMirrors#runtimeMirror
classloader的mirror可以创造invoker的mirror:
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
用来访问实例的方法
可以用InstanceMirror的reflectMethod(MethodSymbol)得到
FieldMirror
用来访问属性(getting/setting)
可以用InstanceMirror的reflectField
ClassMirror
用来创建构造器的调用mirror
可以通过reflectClass(ClassSymbol)得到
ModuleMirror
用来访问单例Object
使用reflectModule(ModuleSymbol)
获取Class的symbol 用Type的typeSymbol 再asClass
获取Filed和Method的symbol 用Type的declaration 参数是newTermName("属性或方法名") 再asTerm(属性可能需要asTerm.accessed.asTerm)
获取构造器的用Type的declaration 参数是nme.CONSTRUCTOR 再asMethod
获取Module的用Type的termSymbol再asModule
本文来自:fair-jm.iteye.com 转截请注明出处
相关推荐
sparknotebook, 在ipython中,使用 Scala 运行 Apache Spark的例子 sparknotebook重要我正处于删除 IScala的过程中,因为它的开发出现停滞。 我正在用 jupyter 替换它。 ,jupyter-scala还没有为 Scala 2.10构建。 ...
hadoop scala spark 例子项目,运行了单机wordcount
24.3 Scala 的高级运行时反射API 458 24.4 宏 461 24.4.1 宏的示例:强制不变性 463 24.4.2 关于宏的最后思考 466 24.5 本章回顾与下一章提要 466 附录A 参考文献 468 作者简介 473 关于封面 ...
便携式scala-reflect:与Scala无关的平台反射 Scala支持的各种平台(JVM,JavaScript和Native)对运行时反射的支持不同。 甚至跨平台支持的功能子集也通过不同的API公开。 该库公开了一个统一的可移植API,用于在...
在浏览器上运行 Scala Scala.js ,Scala.js 是一个将 Scala 语言编译成 JavaScript 的工具,可以让你直接在浏览...
scala习题精选100道,每道都有人工分析,技术点原理,不只是简单的答案
Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。它也能运行于Java ME, CLDC(Java Platform, Micro Edition Connected Limited Device Configuration)上。还有另一.NET平台的实现,不过该版本更新有些滞后...
花了5元订制的快学Scala pdf电子书! Scala是一门以Java虚拟机...Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。
最新制作 scala 2.13.3 API 文档 Html离线版 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。...Scala 运行在 Java 虚拟机上,并兼容现有的 Java 程序。
中文版scala。《快学Scala》是一门以Java虚拟机(JVM)为目标...Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。
移植到 Scala.js 的简单 HTML5 Canvas 游戏 运行应用程序 $ sbt > fastOptJS $ open index-dev.html
Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。 本书适合有一定的Java编程经验、对Scala感兴趣,并希望尽快...
Scala是一门以Java虚拟机(JVM)为目标运行环境并将面向对象和...Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。
scala-2.12.3 scala-2.12.3 scala-2.12.3 scala-2.12.3
使用Scala宏和反射的库。 例子 遍历类型结构 如果定义如下: package example trait SampleStructure { def x : Int def y : SampleGeneric [ String , Long , Int ] def z : List [ Int ] } trait ...
这是一个简单实用的scala集成mybatis数据库查询代码,简单明了
本书共分为 4 个部分:第一部分详细介绍 Scala 的一些基础知识,并和 Java 中的相关概 念进行了参照,方便读者快速上手 Scala;第二部分进一步介绍 Scala 的一些中级知识,以及 与 Java 的一些差异点,方便读者编写...
Cay S.Horstmann所著的《快学...Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。 如果涉及侵权请联系作者删除,谢谢
很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...
但它展现了当把面向对象和函数型语言两种风格,技术地且很有品地混搭在一起时,就形成了 自然和强有力的组合。匹萨的设计成为了 Java泛型的基础,马丁的 GJ(Generic Java)编译 Java 1.3开始成为了 Sun 微系统的...