Scala对class/object反射
近期有需求,要根据解析字符串,根据字符串的内容去调用方法。
想到的基本就是使用反射。但是基本上能找到的资料,全没有讲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] //结果强转下类型
Scala对class/object反射的更多相关文章
- Scala进阶之路-反射(reflect)技术详解
Scala进阶之路-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的反射技术和Java反射用法类似,我这里就不一一介绍反射是啥了,如果对 ...
- scala 学习:object 和class, trait
object: Scala中没有静态修饰符,static,在object下的成员全部都是静态的,如果在类中声明了与该类相同的名字的object则该object是该类的"半生对象", ...
- scala class和object,trait的区别
Scala类 1 2 3 4 5 6 7 8 9 10 11 12 13 class Counter { private var value = 0 // 必须初始化字段 def increm ...
- Object 反射 List
public static object DeserializeModel<T>(object dataModel) { Type type = typeof(T); Object ent ...
- Scala进阶(1)—— 反射 object 和 class
1. Scala 的 反射 关于 Scala 反射的具体内容,可以参考官方文档:https://docs.scala-lang.org/overviews/reflection/overview.ht ...
- 【Scala】Scala之Object
一.前言 前面学习了Scala的Methods,接着学习Scala中的Object 二.Object Object在Scala有两种含义,在Java中,其代表一个类的实例,而在Scala中,其还是一个 ...
- Scala之Object (apply) dycopy
一.前言 前面学习了Scala的Methods,接着学习Scala中的Object 二.Object Object在Scala有两种含义,在Java中,其代表一个类的实例,而在Scala中,其还是一个 ...
- day26——tyoe元类与object的联系、反射、函数与方法的区别、双下方法
day26 type元类与object联系 type 获取对象从属于的类 python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类,都是由type元类(构 ...
- learning scala extractor object
package com.aura.scala.day01 import scala.util.Random object extractorObject { def main(args: Array[ ...
随机推荐
- 解决 Spring Oauth2 RedisTokenStore storeAccessToken 报错 java.lang.NoSuchMethodError: org.springframework.data.redis.connection.RedisConnection.set
原因是Spring 版本兼容问题 参考: https://blog.csdn.net/smollsnail/article/details/78954225 继承 RedisTokenStore 修改 ...
- go 的文件处理
准备一个文件 imooc.txt hello world! 一.使用 io/ioutil 包 定义一个 check 函数 func check(err error) { if err != nil { ...
- Redux-example
Redux-example Examples from http://redux.js.org/docs/introduction/Examples.html Counter Vanilla Run ...
- d4
# s = '132a4b5c'# s1 = s[0]+s[2]+s[1]# print(s1)#使用while和for循环分别打印字符串s=’asdfer’中每个元素.s = 'fkld'# for ...
- vue进阶用法-深入响应式原理
异步更新队列 当vue异步执行更新DOM时,只要观察到数据变化,vue经开启一个队列,并缓冲在同一时间循环中发生的所有数据改变.如果同一个watch被多次触发,只会一次推入到队列中.然后在下一个事件循 ...
- 非节点主机通过内网远程管理docker swarm集群
这是今天使用 docker swarm 遇到的一个问题,终于在睡觉前解决了,在这篇随笔中记录一下. 在 docker swarm 集群的 manager 节点上用 docker cli 命令可以正常管 ...
- 将GitLab数据库从阿里云PostgreSQL RDS迁移至自建的PostgreSQL服务器
阿里云RDS目前支持的是PostgreSQL 9.4,而gitlab支持的最低版本是PostgreSQL 9.6.1,不升级PostgreSQL,gitlab就无法升级,阿里云RDS短期内不进行升级, ...
- CH 0101 - a^b / CH 0102 - 64位整数乘法 - [快速幂和快速乘]
0101 a^b 题目链接:传送门 描述 求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤10^9 输入格式 三个用空格隔开的整数 a,b 和 p. 输出格式 一个整数,表示 a^b mo ...
- [No0000170]Spring Boot慢速入门
Spring的实例化Bean有三种方式: 使用类构造器直接实例化 使用静态工厂的方法实例化 使用实例工厂方法实例化 <?xml version="1.0" encoding= ...
- EF-CodeFirst-基础
什么是Code-First Code-First主要用于领域驱动设计.在Code-First方法中,专注于应用程序的域,先开始为域实体创建类,而不是先设计数据库,然后创建与数据库设计相匹配的类.下图说 ...