近期有需求,要根据解析字符串,根据字符串的内容去调用方法。
想到的基本就是使用反射。但是基本上能找到的资料,全没有讲scala的反射。只有零星点点的讲解。
大部分都是用scala的语法写java反射
最后翻了翻scala的官方文档

发现还在实验阶段。
一不做二不休,索性两种反射方式都来尝试尝试。
其实两种方式实现起来,都差不多,scala的方式好处在于可以反射闭包。
不过这篇文章是讲解的基础的一些反射,后续补上闭包的反射等等。
以下只讲解关键代码,具体细节部分可以参阅官方文档。http://docs.scala-lang.org/overviews/reflection/overview.html

主要实现:
反射调用 scala class 中的函数
反射调用 scala object 中的函数

java 实现反射:
java反射需要继承序列化

extends Serializable

反射调用 scala class 中的函数

val clazz = Class.forName("com.testclass")                            //构造一个需要反射类的对象

clazz                                                                 //使用该对象去获取私有函数
.getDeclaredMethod(s"$函数名", classOf[String], classOf[String]) //并得到该函数入参的数据类型,如有多个入参,要声明多个classOf .invoke(clazz.newInstance(), 入参1, 入参2) //激活该函数,传入入参 .asInstanceOf[String] //最后结果强转下类型,scala默认是返回AnyRef类型

反射调用 scala object 中的函数

val clazz = Class.forName("com.testobject")

clazz
.getDeclaredMethod(s"$函数名", classOf[String], classOf[String]) .invoke(null, 入参1, 入参2) //相当于调用java的静态成员,直接调用就行不需要再new加载 .asInstanceOf[String]

scala 实现反射:

scala反射需要引包

import scala.reflect.runtime.{universe => ru}

反射调用 scala class 中的函数

val classMirror = ru.runtimeMirror(getClass.getClassLoader)         //获取运行时类镜像

val classTest = ClassMirror.reflect(new com.testclass)              //获取需要反射的类对象

val methods = ru.typeOf[com.testclass]                              //构造获取方式的对象

val method = Methods.decl(ru.TermName(s"$函数名")).asMethod          //获取需要调用的函数

val result = classTest.reflectMethod(Method)(入参1, 入参2)           //反射调用函数,并传入入参

result.asInstanceOf[String]                                         //返回的结果强转下类型,scala默认是AnyRef类型

反射调用 scala object 中的函数

val classMirror = ru.runtimeMirror(getClass.getClassLoader)         //获取运行时类镜像

val classTest = classMirror.staticModule("com.testobject")          //获取需要反射object

val methods = classMirror.reflectModule(classTest)                  //构造获取方式的对象

val objMirror = classMirror.reflect(methods.instance)               //反射结果赋予对象

val method = methods.symbol.typeSignature.member(ru.TermName(s"$函数名")).asMethod  //反射调用函数

val result = objMirror.reflectMethod(method)(入参1, 入参2)           //最后带参数,执行这个反射调用的函数

result.asInstanceOf[String]                                         //结果强转下类型

最新文章

  1. 下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍
  2. HTML 图像显示
  3. python class对象转换成json/字典
  4. apache-flume-1.5.0-bin windows
  5. objc_msgSend()报错Too many arguments to function call ,expected 0,have3
  6. javaSE之如何将一个文档显示出来(,txt,.doc,.....)
  7. Hibernate联合主键映射
  8. ImageView 设置图片
  9. Linux进程间通信方法总结
  10. Codeforces Round #359 (Div. 2) C. Robbers' watch (暴力DFS)
  11. CDN原理
  12. 用C#实现网络爬虫(二)
  13. list append 总是复制前面的参数,而不复制最后一个参数
  14. jquery与ajax的应用
  15. httpd的三种模式比较
  16. C# -- 使用Ping检查网络是否正常
  17. 部署Qt应用时候报错0xc000007b
  18. CCF-URL映射-(正则匹配)-20180303
  19. Debian 7.0(Wheezy) 安装配置笔记
  20. UI设计初学者必备的工具以及学习路线(附思维导图)

热门文章

  1. case when then end
  2. HTML滚动文字代码 marquee标签
  3. [No0000DA]WPF ControlTemplate简介
  4. React兄弟、父子元素之间的通信
  5. Django:模型model和数据库mysql(一)
  6. layer开启与关闭加载层
  7. 口语详解|为什么“how to say”是错的?
  8. End-to-end and Hop-by-hop Headers ---nginx-websocket
  9. 状压dp的另一种形式
  10. LeetCode 575 Distribute Candies 解题报告