加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala对class/object反射

发布时间:2020-12-16 09:17:14 所属栏目:安全 来源:网络整理
导读:近期有需求,要根据解析字符串,根据字符串的内容去调用方法。 想到的基本就是使用反射。但是基本上能找到的资料,全没有讲scala的反射。只有零星点点的讲解。 大部分都是用scala的语法写java反射 最后翻了翻scala的官方文档 发现还在实验阶段。 一不做二不

近期有需求,要根据解析字符串,根据字符串的内容去调用方法。
想到的基本就是使用反射。但是基本上能找到的资料,全没有讲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]) .invoke(null,入参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] //结果强转下类型

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读