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 ...
随机推荐
- ubuntu在windows下的wubi安装
转自:http://mp.weixin.qq.com/s?__biz=MjM5NjYxNjU0OQ==&mid=200664819&idx=2&sn=25719890570b1 ...
- PAT 1083 是否存在相等的差
https://pintia.cn/problem-sets/994805260223102976/problems/994805260780945408 给定 N 张卡片,正面分别写上 1.2.…… ...
- HDU 2053 Switch Game
http://acm.hdu.edu.cn/showproblem.php?pid=2053 Problem Description There are many lamps in a line. A ...
- ActiveMQ应用(1)-安装及示例
简介: Apache ActiveMQ ™ 是最流行最强大的开源消息及继承模式服务器.i Apache ActiveMQ 速度快,支持多种语言的客户端及代理,可便捷的使用企业集成模式,完整支持JMS1 ...
- 自定义组件的 v-model
Vue.component('base-checkbox', { model: { prop: 'checked', event: 'change' }, props: { checked: Bool ...
- MySQL乐观锁在分布式场景下的实践
背景 在电商购物的场景下,当我们点击购物时,后端服务就会对相应的商品进行减库存操作.在单实例部署的情况,我们可以简单地使用JVM提供的锁机制对减库存操作进行加锁,防止多个用户同时点击购买后导致的库存不 ...
- Spring MVC @ModelAttribute注解
在一个Controller内,被@ModelAttribute标注的方法会在此controller的每个handler方法执行前被执行. 被@ModelAttribute标注的方法的参数绑定规则和普通 ...
- linux下拷贝文件夹的时候排除其中的一些目录
http://blog.csdn.net/wind19/article/details/8960574 使用find cd /usr find ./tmp/ | grep -v tmp/dirc | ...
- Spring各个jar包的作用
Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects:Spring提供的对AspectJ框架的整合Spring Beans:Spring I ...
- BZOJ1895Pku3580 supermemo——非旋转treap
题目描述 给出一个初始序列fA1;A2;:::Ang,要求你编写程序支持如下操作: 1. ADDxyD:给子序列fAx:::Ayg的每个元素都加上D.例如对f1,2, 3,4,5g执行"AD ...