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[ ...
随机推荐
- 排查java进程cpu占用高的问题
一.思路 分两步,主要是找出占用cpu高的进程,再找出该进程内到底是哪个线程占用cpu高. 二.找出占用cpu高的进程 参考: https://blog.csdn.net/hfhwfw/article ...
- 使用jenkins pipeline,并发selenium测试 --- 你值得了解
一.契机 相信很多使用selenium进行UI测试,再对接jenkins时,都是简单的在jenkins上将命令输入就完事了. 但是,相信你一定会遇到以下问题: 1.你需要同时跑不同文件或不同类的用例, ...
- Web 通信 之 长连接、长轮询(long polling)(转载)
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...
- Docker详解
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
- solus 系统 - 更新软件源
清华稳定源sudo eopkg ar Tuna https://mirrors.tuna.tsinghua.edu.cn/solus/shannon/eopkg-index.xml 清华不稳定源sud ...
- zynq里面的AXI总线(2017-1-11)
在ZYNQ中有支持三种AXI总线,拥有三种AXI接口,当然用的都是AXI协议.其中三种AXI总线分别为: AXI4:(For high-performance memory-mapped requir ...
- linux_check
linux_check echo "********CPU****************" echo 总核数 = 物理CPU个数 X 每颗物理CPU的核数 echo " ...
- 泡泡一分钟:Stabilize an Unsupervised Feature Learning for LiDAR-based Place Recognition
Stabilize an Unsupervised Feature Learning for LiDAR-based Place Recognition Peng Yin, Lingyun Xu, Z ...
- 蓝桥杯_算法训练_区间k大数查询
问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...
- 安装指定版本的nodejs
node有一个模块n,是专门用来管理node.js的版本的. 1.安装n模块: npm install -g n 2.升级node.js到最新稳定版 n stable 3.安装指定版本: n v6.1 ...