Scala进阶之路-反射(reflect)技术详解
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)技术详解的更多相关文章
- Scala进阶之路-Scala高级语法之隐式(implicit)详解
Scala进阶之路-Scala高级语法之隐式(implicit)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们调用别人的框架,发现少了一些方法,需要添加,但是让别人为你一 ...
- Scala进阶之路-面向对象编程之类的成员详解
Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...
- Scala进阶之路-Scala函数篇详解
Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...
- Java基础-反射(reflect)技术详解
Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制 如下图所示,JVM类加载机制分为五个部分 ...
- Scala进阶之路-Scala中的高级类型
Scala进阶之路-Scala中的高级类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类型(Type)与类(Class)的区别 在Java里,一直到jdk1.5之前,我们说 ...
- Scala进阶之路-Scala中的Ordered--Ordering
Scala进阶之路-Scala中的Ordered--Ordering 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 说道对象的比较,在Java中大家最熟悉不过的就是实现类本身实 ...
- Scala进阶之路-为什么要学习Scala以及开发环境搭建
Scala进阶之路-为什么要学习Scala以及开发环境搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近人工智能和大数据那是相当的火呀,人工智能带动了Python的流行,区块 ...
- Scala进阶之路-Scala中的枚举用法案例展示
Scala进阶之路-Scala中的枚举用法案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的枚举值和Java中的枚举值有点差别,不过使用起来也都差大同小异,我这 ...
- Scala进阶之路-正则表达式案例
Scala进阶之路-正则表达式案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 废话不多说,正则大家都很清楚,那在Scala如何使用正则了?我们直接上个案例,如下: /* @au ...
随机推荐
- [转帖]JavaEE中Web服务器、Web容器、Application服务器区别及联系
JavaEE中Web服务器.Web容器.Application服务器区别及联系 https://www.cnblogs.com/vipyoumay/p/5853694.html 在JavaEE 开发W ...
- [转帖]UML各种图总结-精华
UML各种图总结-精华 https://www.cnblogs.com/jiangds/p/6596595.html 之前自己以为画图很简单 不需要用心学 现在发现自己一直没有学会一些基础的知识 能力 ...
- MiniDP与HDMI的关系
高清输出革命先行者:HDMI接口 HDMI高清晰度多媒体接口(英文:High Definition Multimedia Interface,HDMI)是一种数字化视频/音频接口技术,是适合影像传输的 ...
- Jenkins 登录提示 登录无效 的解决办法
学习自:https://www.cnblogs.com/amberly/p/6288773.html 1. jenkins服务器重启之后, 再次登录提示登录无效. 重启多次也无法解决. 2. 根据文档 ...
- [转帖]什么是安全散列算法SHA256?
什么是安全散列算法SHA256? http://8btc.com/article-136-1.html 发布者: 无主之地 发表于: 2013-10-1 01:31 78152 2 分享 安全散列 ...
- Linux 重启网络提示找不到eth0(no device found for “System eth0”)
一.背景 使用VMWare创建了一个虚拟机(VM1),然后通过拷贝的方式创建了另一台虚拟机(VM2).在第二台虚拟机上设置网卡为固定IP,使用service network restart重启网络的时 ...
- BZOJ2017[USACO 2009 Nov Silver 1.A Coin Game]——DP+博弈论
题目描述 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为“Xoinc”的两人硬币游戏. 初始时,一个有N(5 <= N <= 2,000)枚硬币的堆栈放在地上,从堆顶数起的第I枚硬币的 ...
- day28 staticmethod 装饰器
静态方法装饰器 完全面向对象的程序中,如果存在某个函数既和对象无关也和类无关,就用staticmethod方法, 在调用此方法的时候只需要加上类名即可,说白了就是强行面向对象....把不是对象的方法也 ...
- 值得Python小白学习的书 简单推荐几本吧
于我个人而言,我很喜欢Python,当然我也有很多的理由推荐你去学python.我只说两点.一是简单,二是写python薪资高.我觉得这俩理由就够了,对不对.买本书,装上pycharm,把书上面的例子 ...
- 自学Linux Shell15.2-作业控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab)
点击返回 自学Linux命令行与Shell脚本之路 15.1-作业控制命令(jobs/bg/nice/renice/at/atp/atrm/crontab) 1 控制作业 1.1查看作业 (jobs ...