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[ ...
随机推荐
- [IOI 2000]POJ 1160 Post Office
Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22278 Accepted: 12034 Descrip ...
- QT 获取电脑时间
使用环境: VS2010 & QT Designer5 #include <QDateTime> //包含头文件 QDateTime local(QDateTime::curre ...
- vb学习基础之val函数与val(&HFFFF) 的理解
在VB语言中,val函数可以把数值字符串==转为==>数值的函数,在它不能识别为数字的第一个字符上,停止读入字符串. 那些被认为是数值的一部分的符号和字符,例如美元号与逗号,都不能被识别.但是能 ...
- D - Equation Again
This problem's author is too lazy to write the problem description, so he only give you a equation l ...
- nodejs抓取页面内容,并分析有无某些内容的js文件
nodejs获取网页内容绑定data事件,获取到的数据会分几次相应,如果想全局内容匹配,需要等待请求结束,在end结束事件里把累积起来的全局数据进行操作! 举个例子,比如要在页面中找有没有www.ba ...
- Flask web开发之路二
今天创建第一个flask项目,主app文件代码如下: # 从flask这个框架导入Flask这个类 from flask import Flask #初始化一个Flask对象 # Flasks() # ...
- Java学习者论坛【申明:来源于网络】
学习者论坛[申明:来源于网络] 1.Java学习者论坛 2.51论坛 3.csdn论坛 4.JAVA ME论坛 地址|: http://www.javaxxz.com/ 地址|: http://bbs ...
- Shell----简单整理
------------------------------------------------------------------Shell脚本--------------------------- ...
- easyui treegrid 动态展开数据(暂记)
ClassifyAdminSynMsgSvr.GetCLFLList("<%=CurUTag %>", 1, "", function (ret) ...
- 我学到的新知识之——Lotus Notes闪退如何修复
很多企业内部都在使用IBM 出品的Lotus Notes 来收发邮件,以及内置的SameTime作为内部交流工具,作为用了多年微软套装产品的我来说,还是有些不适应. 最近遇到一个案例,只要用户登陆sa ...