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[ ...
随机推荐
- 如何将Unicode文本写到日志文件中
有时为了定位问题,我们需要结合打印日志来处理.特别是较难复现的,一般都需要查看上下文日志才能找出可能存在的问题.考虑到程序要在不同语言的操作系统上运行,程序界面显示要支持Unicode,打印出来的日志 ...
- echarts - 使用echarts过程中遇到的问题(pending...)
1. 配合tab切换时,被display:none的元素init设置echarts失败 2018-11-09 18:09:35 现象描述:有一个tabs选项卡,每个切换项A.B中都有使用echart ...
- jQuery学习之二
jQuery对象获取方法:var $cr=$("#cr"); //jQuery方法获取的是一个·对象数组. var cr=$cr[0] // var cr=$cr.get(0); ...
- Python基础爬虫
搭建环境: win10,Python3.6,pycharm,未设虚拟环境 之前写的爬虫并没有架构的思想,且不具备面向对象的特征,现在写一个基础爬虫架构,爬取百度百科,首先介绍一下基础爬虫框架的五大模块 ...
- centos 安装教程 服务器配置教程 服务器中安装python 服务器中安装Django 安装MySQL 配置MySQL
一 .解决python编译安装所需的软件依赖 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel opens ...
- PHP微信支付开发
此链接https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_2,是微信官方的示例,无效,报错. 1.申请微信支付的开通条件?什么样的账号可以 ...
- [No0000187]可能是把Java内存区域讲的最清楚的一篇文章
写在前面(常见面试题) 基本问题: 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针 ...
- tensorflow使用pb文件进行模型预测
- linux虚拟机设置本地yum源
1.挂载ISO镜像 2.创建文件夹,用于挂载光盘,mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom 3.修改 repo 文件 baseurl=file:///挂 ...
- php值callback类型和匿名函数(闭包)
callback.callable类型 自PHP5.4起可以使用callable类型制定回调类型callback. 本文档基于同样理由使用callback类型信息. 一些函数如call_user_fu ...