加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

scala中的反射机制

(2020-03-29 00:04:24)
标签:

scala

反射

reflect

示例

分类: 编程技术
====scala中通过反射机制读取属性的值=========

一、大致思路
1、通过getClass()定位到实例类,通过getDeclaredField定位到具体某个属性值
2、通过isAccessible确认属性值是否可以直接读取,不行的话则通过setAccessible(true)设置为可访问权限
3、通过 属性值.getXX(实例类) 的方法读取到具体的属性值数据


二、示例代码
object ReflectTest {

  case class User(name: String, age: Int)

  def main(args: Array[String]) = {
    val usersList = List(("hugh", 21), ("jack", 43), ("fznny", 15))
    val users = usersList.map(x => User(x._1, x._2))
    users.foreach{x =>
      val age = x.getClass().getDeclaredField("age")
      println(age.isAccessible)
      age.setAccessible(true)
      println(age.isAccessible)
      println("age: " + age.getInt(x))
    }

  }
}

输出值为:
false
true
age: 21
false
true
age: 43
false
true
age: 15


====scala中通过反射机制执行函数=========

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]                                         //结果强转下类型

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有