本文来自: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 转截请注明出处
相关推荐
2. **标准库**:Scala的标准库提供了大量的类和模块,包括集合操作、I/O、反射、并发处理等,这些是编写Scala程序的基础。 3. **Scala REPL**:Read-Eval-Print Loop,交互式解释器,允许开发者即时测试代码片段,...
例如,Scala 2.11引入了反射API的改进,使得在运行时检查和操作类型更加方便。此外,它还提供了更好的错误消息,以帮助开发者调试代码。 在压缩包文件列表中,有两个不同的Scala版本——2.11.12和2.11.8。这两个...
Scala运行在Java虚拟机(JVM)上,因此它可以无缝地与Java库和框架集成。 Scala的关键特性包括: 1. **类型系统**:Scala具有静态类型,确保了代码的可靠性和安全性。它还引入了类型推断,允许程序员编写更简洁的...
Scala运行在Java虚拟机(JVM)上,因此可以充分利用Java生态系统的资源。 2. Scala 2.11.x系列: Scala 2.11.x是一个重要的版本系列,它引入了许多新特性,包括更好的类型推断、元编程增强、更丰富的并发支持以及...
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 2.12.2中,反射API提供了一些高级功能,如创建和操作类型、实例化...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。...通过解压、配置环境变量和简单的命令行操作,用户可以在Ubuntu系统上编写、编译和运行Scala程序,享受到这种强大编程语言带来的便利。
6. ** Scala Reflection**:Scala-2.11.0包含了反射API,允许在运行时检查和操作类型和对象。这部分源码展示了如何在Scala中实现动态编程和元编程。 7. ** Scaladoc**:Scala的文档生成工具Scaladoc也包含在源码包...
2. `lib`目录:包含了Scala运行时所需的jar文件,这些库支持Scala的语法和特性,如反射、模式匹配等。 3. `doc`目录:包含Scala语言和API的文档,对于学习和参考非常有用。 4. `src`目录:可能包含Scala源码,这对于...
7. **与Java的互操作性**:由于Scala运行在JVM上,因此可以直接调用Java库,这使得迁移现有Java项目到Scala变得容易。 8. **DSL(领域特定语言)**:Scala的语法灵活性使得构建内部DSL变得简单,可以为特定领域定制...
Scala运行在Java虚拟机(JVM)上,因此可以充分利用Java生态系统的资源。 这本书"Scala编程-中文版"可能涵盖了以下几个重要的知识点: 1. **基础语法**:Scala的基础语法与Java类似,但更简洁。它引入了模式匹配、...
7. **元编程**:Scala支持元编程,可以通过反射和宏来在编译时或运行时动态地修改程序。 8. **Actor模型**:Scala通过Akka库支持并发编程,Actor模型提供了一种处理并发问题的方式,每个Actor有自己的状态和邮箱,...
Scala的反射机制允许在运行时检查和操作类型,这对于元编程和动态配置非常有用。它比Java的反射更加安全,因为所有操作都在类型系统的控制之下。 9. **Scaladoc** Scala的文档工具Scaladoc能自动生成API文档,...
`Manifest`和`TypeTag`是2.8.0中引入的元编程工具,它们允许在运行时获取类型信息,这对于反射和动态类型的操作非常有用。例如,`TypeTag`在编译时和运行时都能提供类型信息,对于实现类型安全的DSL(领域特定语言)...
10. **反射**:Scala提供了强大的反射机制,允许在运行时检查和修改程序的结构。 11. **并行编程**:Scala的Parallel Collections库提供了一种简单的方式来编写并行代码,使得开发者能够利用多核处理器的优势。 12...
9. **元编程**:Scala允许在运行时生成和操作代码,这得益于它的反射和动态类型的能力。它可以用来创建更灵活和强大的API。 10. **未来和承诺(Future and Promise)**:在处理异步编程时,Scala提供了Future和...
7. **类型安全的元编程**:Scala的反射和元编程能力允许在运行时检查和操作类、对象和方法,同时保持类型安全。这在构建框架和工具时尤其有用。 8. **特质(Trait)**:Scala的特质是实现多重继承的一种方式,可以...
自包含:Accord基于宏,但是完全自包含,因此仅依赖Scala运行时和反射库。 集成的:除了提供自己的DSL和匹配器库之外,Accord的设计目的是轻松与更大的Scala生态系统集成,并提供对的现成支持以及 , 集成模块和 ...
版本号"3.2.9"表示这是JSON4S对Scalaz支持的一个特定稳定版本,适用于Scala 2.11运行时环境。 在JSON4S中,AST(抽象语法树)是JSON数据的内部表示形式,它允许开发者以结构化的方式操作JSON对象,例如查询、转换或...