Scala进阶之路-反射(reflect)技术详解

                                作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  Scala中的反射技术和Java反射用法类似,我这里就不一一介绍反射是啥了,如果对Java的反射感兴趣的话可以参考我之前分享的笔记:https://www.cnblogs.com/yinzhengjie/p/9272289.html。好了,废话不多说,我们直接上一个Scala的案例。

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.scalaReflect class Person(name:String,age:Int) {
def sayHello() = {
println(s"Hi,I'm ${name},Nice to meet you!")
} def palyGame(msg:String) = {
println(s"${name} 正在玩《${msg}》,这局已经拿下了8次五杀了.......")
} override def toString: String = {
s"姓名:${name},年龄:${age}"
} } object PersonDemo {
def main(args: Array[String]): Unit = {
//得到JavaUniverse用于反射(获取Environment和universe)
val ju = scala.reflect.runtime.universe
//得到一个JavaMirror,用于反射Person.class(获取对应的Mirrors,这里是运行时的)
val mirror = ju.runtimeMirror(getClass.getClassLoader)
//得到Person类的Type对象后,得到type的特征值并转为ClassSymbol对象
val classPerson = ju.typeOf[Person].typeSymbol.asClass
//用Mirrors去reflect对应的类,返回一个Mirrors的实例,而该Mirrors装载着对应类的信息
val classMirror = mirror.reflectClass(classPerson)
//得到构造器方法
val constructor = ju.typeOf[Person].decl(ju.termNames.CONSTRUCTOR).asMethod
//得到MethodMirror
val methodMirror = classMirror.reflectConstructor(constructor)
/**
* Scala通过反射实例化对象
*/
val p = methodMirror("yinzhengjie",18)
println(p.toString) /**
* Scala通过反射调用方法
*/
val instanceMirror = mirror.reflect(p)
//得到Method的mirror
val mysayHelloMethod = ju.typeOf[Person].decl(ju.TermName("sayHello")).asMethod
val mypalyGameMethod = ju.typeOf[Person].decl(ju.TermName("palyGame")).asMethod
//通过Method的Mirror索取方法
val mysayHello = instanceMirror.reflectMethod(mysayHelloMethod)
val mypalyGame = instanceMirror.reflectMethod(mypalyGameMethod)
//调用我们自定义的方法
mysayHello()
mypalyGame("英雄联盟") /**
* Scala通过反射访问属性
*/
val nameField = ju.typeOf[Person].decl(ju.TermName("name")).asTerm
val name = instanceMirror.reflectField(nameField)
println("通过反射得到name的值为:"+name.get)
}
} /*
以上代码执行结果如下:
姓名:yinzhengjie,年龄:18
Hi,I'm yinzhengjie,Nice to meet you!
yinzhengjie 正在玩《英雄联盟》,这局已经拿下了8次五杀了.......
通过反射得到name的值为:yinzhengjie
*/

Scala进阶之路-反射(reflect)技术详解的更多相关文章

  1. Scala进阶之路-Scala高级语法之隐式(implicit)详解

    Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...

  2. Scala进阶之路-面向对象编程之类的成员详解

    Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...

  3. Scala进阶之路-Scala函数篇详解

    Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...

  4. Java基础-反射(reflect)技术详解

    Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制  如下图所示,JVM类加载机制分为五个部分 ...

  5. Scala进阶之路-Scala中的高级类型

    Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...

  6. Scala进阶之路-Scala中的Ordered--Ordering

    Scala进阶之路-Scala中的Ordered--Ordering 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   说道对象的比较,在Java中大家最熟悉不过的就是实现类本身实 ...

  7. Scala进阶之路-为什么要学习Scala以及开发环境搭建

    Scala进阶之路-为什么要学习Scala以及开发环境搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近人工智能和大数据那是相当的火呀,人工智能带动了Python的流行,区块 ...

  8. Scala进阶之路-Scala中的枚举用法案例展示

    Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ...

  9. Scala进阶之路-正则表达式案例

    Scala进阶之路-正则表达式案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 废话不多说,正则大家都很清楚,那在Scala如何使用正则了?我们直接上个案例,如下: /* @au ...

随机推荐

  1. 使用msysgit上传项目到github

    综合这几个教程,终于提价了项目,总结一下流程. (教程1[github入门教程]:http://jingpin.jikexueyuan.com/article/1037.html) (教程2[常见错误 ...

  2. EL表达式和JSTL标签库

    expresion language表达式语言 可以输出表达式的值.跟jsp的表达式脚本一样.计算表达式的值后输出.  EL表达式出现的目的是为了使JSP写起来更加简单,让jsp的代码更佳简化. 1. ...

  3. TCP系列11—重传—1、TCP重传概述

    在最开始介绍TCP的时候,我们就介绍了TCP的三个特点,分别是面向连接.可靠.字节流式.前面内容我们已经介绍过了TCP的连接管理,接下来的这部分内容将会介绍与TCP可靠性强关联的TCP重传. 很多网络 ...

  4. 文本文件合并(C++实现)

    直接附上代码吧 #include<iostream> #include<fstream> #include<cstdlib> using namespace std ...

  5. JsTree使用一例

    SearchDesignPatent.treeContainer().jstree({ 'core' : { 'data' : json.data }, }).bind('click.jstree', ...

  6. jq源码解析之绑在$,jQuery上面的方法

    1.当我们用$符号直接调用的方法.在jQuery内部是如何封装的呢?有没有好奇心? // jQuery.extend 的方法 是绑定在 $ 上面的. jQuery.extend( { //expand ...

  7. nodefs模块的使用demo

    为什么要使用递归?因为stat本身就是一个异步的函数所有存在异步问题不能够进行循环遍历. 在使用该种方法时候需要注意的一点是必须要在箭头标记处进行数据数组的存取.否则会由于异步问题导致输出空或者其他问 ...

  8. GitLab添加ssh-key,操作无需每次输入账号密码

    git config --global credential.helper store 然后操作pull/push 会让输入用户名密码,第一次输入进去.下次再操作pull/push时就不需要输入用户名 ...

  9. SAP PP顾问面试题及资料

    SAP PP顾问面试试题及资料 1.主数据 组织架构 •SAP中主要的组织架构有哪些?哪些用于PP的组织架构?•成本控制范围.公司代码.估价范围.工厂.库存地点之间的关系 物料主数据 •不同的物料主数 ...

  10. protocol buffer开发指南(官方)

    欢迎来到protocol buffer的开发者指南文档,一种语言无关.平台无关.扩展性好的用于通信协议.数据存储的结构化数据序列化方法. 本文档是面向计划将protocol buffer使用的到自己的 ...