近期有需求,要根据解析字符串,根据字符串的内容去调用方法。
想到的基本就是使用反射。但是基本上能找到的资料,全没有讲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反射的更多相关文章

  1. Scala进阶之路-反射(reflect)技术详解

    Scala进阶之路-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的反射技术和Java反射用法类似,我这里就不一一介绍反射是啥了,如果对 ...

  2. scala 学习:object 和class, trait

    object: Scala中没有静态修饰符,static,在object下的成员全部都是静态的,如果在类中声明了与该类相同的名字的object则该object是该类的"半生对象", ...

  3. 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 ...

  4. Object 反射 List

    public static object DeserializeModel<T>(object dataModel) { Type type = typeof(T); Object ent ...

  5. Scala进阶(1)—— 反射 object 和 class

    1. Scala 的 反射 关于 Scala 反射的具体内容,可以参考官方文档:https://docs.scala-lang.org/overviews/reflection/overview.ht ...

  6. 【Scala】Scala之Object

    一.前言 前面学习了Scala的Methods,接着学习Scala中的Object 二.Object Object在Scala有两种含义,在Java中,其代表一个类的实例,而在Scala中,其还是一个 ...

  7. Scala之Object (apply) dycopy

    一.前言 前面学习了Scala的Methods,接着学习Scala中的Object 二.Object Object在Scala有两种含义,在Java中,其代表一个类的实例,而在Scala中,其还是一个 ...

  8. day26——tyoe元类与object的联系、反射、函数与方法的区别、双下方法

    day26 type元类与object联系 type 获取对象从属于的类 python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类,都是由type元类(构 ...

  9. learning scala extractor object

    package com.aura.scala.day01 import scala.util.Random object extractorObject { def main(args: Array[ ...

随机推荐

  1. (ecj)Eclipse的Java编译器分析之一——ecj介绍

    Java是一个开放的平台,对于除发布编译器/解释器/基础类库之外,该语言的负责机构更多的是制定一系列标准,任何符合标准的厂商产品均可用于市场投放.甚至包括其编译器及解释器. (比如Hibernate提 ...

  2. datagrid---columns列

    { field:"city", //字段名,从后台传来的要一致 title:"城市",//列的标题文字. width:,//列的宽度 formatter:fun ...

  3. PL-SLAM

    双目 1.PL-SLAM: a Stereo SLAM System through the Combination of Points and Line Segments ubuntu14.04配置 ...

  4. Elasticsearch 2.3.3 JAVA api说明文档

    原文地址:https://www.blog-china.cn/template\documentHtml\1484101683485.html 翻译作者:@青山常在人不老 加入翻译:cdcnsuper ...

  5. node 下查看安装插件的最新版本号的方法

    例如查看extract-text-webpack-plugin的最新版本号 (不一定时本地安装的插件的版本号) npm view extract-text-webpack-plugin version ...

  6. C和C指针小记(十)-函数

    1.函数的定义 函数的定义就是函数体的实现. 语法: 类型 函数名(形式参数) 代码块 函数返回类型和函数名分开写是代码风格的问题,现代语言如swift返回值在函数名和参数表的后面,这样使得某些工程工 ...

  7. Exception 01 : org.hibernate.engine.jndi.JndiException: Error parsing JNDI name [foo]

    异常名称 org.hibernate.engine.jndi.JndiException: Error parsing JNDI name [foo] 异常截屏 异常详细信息 org.hibernat ...

  8. Shell实现判断进程是否存在并重新启动脚本

    Shell实现判断进程是否存在并重新启动脚本 - superbfly的专栏 - CSDN博客 https://blog.csdn.net/superbfly/article/details/52513 ...

  9. 如何辨别高潜牛人的六个方法,据说源自500强HR

    如果你是一名领导,当老板派下来任务让你招人的时候,你有考虑过怎么招到合适的人么?今天,架构师米洛特意分享一篇优秀的网络文章,据说来自500强的HR,希望对你招人有所帮助. 如何识人是HR及管理者重要的 ...

  10. 【Linux】Linux 常用命令汇总

    查看软件xxx安装内容:dpkg -L xxx 查找软件库中的软件:apt-cache search 正则表达式 查找软件库中的软件:aptitude search 软件包 查找文件属于哪个包:dpk ...