• 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]                                         //结果强转下类型
  • 相关阅读:
    Leetcode 694. 不同岛屿的数量 中等 回溯 岛屿问题
    集成电路设计流程
    Leetcode 44. 通配符匹配 困难 动态规划 精选 TOP 面试题
    Leetcode 13. 罗马数字转整数 简单 字符串
    Leetcode 36. 有效的数独 中等 数组遍历 精选 TOP 面试题
    windows 不是真正的多用户OS,linux才是
    java AWT弹球游戏
    java AWT 图片查看器
    java AWT 简易绘图
    java Swing 进度条
  • 原文地址:https://www.cnblogs.com/itboys/p/9862120.html
Copyright © 2020-2023  润新知