`

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 转截请注明出处

 

分享到:
评论

相关推荐

    scala sdk scala-2.12.3

    2. **标准库**:Scala的标准库提供了大量的类和模块,包括集合操作、I/O、反射、并发处理等,这些是编写Scala程序的基础。 3. **Scala REPL**:Read-Eval-Print Loop,交互式解释器,允许开发者即时测试代码片段,...

    scala-2.11 环境,免安装版,配置环境变量即可使用

    例如,Scala 2.11引入了反射API的改进,使得在运行时检查和操作类型更加方便。此外,它还提供了更好的错误消息,以帮助开发者调试代码。 在压缩包文件列表中,有两个不同的Scala版本——2.11.12和2.11.8。这两个...

    scala-2.10.5.tgz

    Scala运行在Java虚拟机(JVM)上,因此它可以无缝地与Java库和框架集成。 Scala的关键特性包括: 1. **类型系统**:Scala具有静态类型,确保了代码的可靠性和安全性。它还引入了类型推断,允许程序员编写更简洁的...

    scala-2.11.12

    Scala运行在Java虚拟机(JVM)上,因此可以充分利用Java生态系统的资源。 2. Scala 2.11.x系列: Scala 2.11.x是一个重要的版本系列,它引入了许多新特性,包括更好的类型推断、元编程增强、更丰富的并发支持以及...

    Scala程序设计(第2版)

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

    scala-2.12.2 api 最新 离线文档

    首先,`scala-reflect`模块是Scala的反射库,它允许在运行时检查和修改程序结构。反射在许多场景下非常有用,例如元编程、动态类型和自省。在Scala 2.12.2中,反射API提供了一些高级功能,如创建和操作类型、实例化...

    scala-2.11.8.tgz

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的概念。...通过解压、配置环境变量和简单的命令行操作,用户可以在Ubuntu系统上编写、编译和运行Scala程序,享受到这种强大编程语言带来的便利。

    scala-2.11.0.zip

    6. ** Scala Reflection**:Scala-2.11.0包含了反射API,允许在运行时检查和操作类型和对象。这部分源码展示了如何在Scala中实现动态编程和元编程。 7. ** Scaladoc**:Scala的文档生成工具Scaladoc也包含在源码包...

    scala-2.12.2.tgz

    2. `lib`目录:包含了Scala运行时所需的jar文件,这些库支持Scala的语法和特性,如反射、模式匹配等。 3. `doc`目录:包含Scala语言和API的文档,对于学习和参考非常有用。 4. `src`目录:可能包含Scala源码,这对于...

    scala编程中文版

    7. **与Java的互操作性**:由于Scala运行在JVM上,因此可以直接调用Java库,这使得迁移现有Java项目到Scala变得容易。 8. **DSL(领域特定语言)**:Scala的语法灵活性使得构建内部DSL变得简单,可以为特定领域定制...

    Scala编程中文版

    Scala运行在Java虚拟机(JVM)上,因此可以充分利用Java生态系统的资源。 这本书"Scala编程-中文版"可能涵盖了以下几个重要的知识点: 1. **基础语法**:Scala的基础语法与Java类似,但更简洁。它引入了模式匹配、...

    Scala 的介绍

    7. **元编程**:Scala支持元编程,可以通过反射和宏来在编译时或运行时动态地修改程序。 8. **Actor模型**:Scala通过Akka库支持并发编程,Actor模型提供了一种处理并发问题的方式,每个Actor有自己的状态和邮箱,...

    Programming Scala

    Scala的反射机制允许在运行时检查和操作类型,这对于元编程和动态配置非常有用。它比Java的反射更加安全,因为所有操作都在类型系统的控制之下。 9. **Scaladoc** Scala的文档工具Scaladoc能自动生成API文档,...

    scala-2.8.0.final

    `Manifest`和`TypeTag`是2.8.0中引入的元编程工具,它们允许在运行时获取类型信息,这对于反射和动态类型的操作非常有用。例如,`TypeTag`在编译时和运行时都能提供类型信息,对于实现类型安全的DSL(领域特定语言)...

    Scala_API_For_2.7.6

    10. **反射**:Scala提供了强大的反射机制,允许在运行时检查和修改程序的结构。 11. **并行编程**:Scala的Parallel Collections库提供了一种简单的方式来编写并行代码,使得开发者能够利用多核处理器的优势。 12...

    scala-course-master.rar

    9. **元编程**:Scala允许在运行时生成和操作代码,这得益于它的反射和动态类型的能力。它可以用来创建更灵活和强大的API。 10. **未来和承诺(Future and Promise)**:在处理异步编程时,Scala提供了Future和...

    Scala_2.7.6_API_离线精简2009.09.15.rar

    7. **类型安全的元编程**:Scala的反射和元编程能力允许在运行时检查和操作类、对象和方法,同时保持类型安全。这在构建框架和工具时尤其有用。 8. **特质(Trait)**:Scala的特质是实现多重继承的一种方式,可以...

    Accord:Accord:Scala的健全验证库

    自包含:Accord基于宏,但是完全自包含,因此仅依赖Scala运行时和反射库。 集成的:除了提供自己的DSL和匹配器库之外,Accord的设计目的是轻松与更大的Scala生态系统集成,并提供对的现成支持以及 , 集成模块和 ...

    json4s-scalaz_2.11-3.2.9.zip

    版本号"3.2.9"表示这是JSON4S对Scalaz支持的一个特定稳定版本,适用于Scala 2.11运行时环境。 在JSON4S中,AST(抽象语法树)是JSON数据的内部表示形式,它允许开发者以结构化的方式操作JSON对象,例如查询、转换或...

Global site tag (gtag.js) - Google Analytics