scala 反射

  • Post author:
  • Post category:其他


主要实现:

java 实现反射:

java反射需要继承序列化

extends Serializable

反射调用 scala class 中的函数


val clazz = Class.forName("com.testclass") //构造一个需要反射类的对象


  1. clazz //使用该对象去获取私有函数


  2. .getDeclaredMethod(s"$函数名", classOf[String], classOf[String]) //并得到该函数入参的数据类型,如有多个入参,要声明多个classOf


  3. .invoke(clazz.newInstance(), 入参1, 入参2) //激活该函数,传入入参


  4. .asInstanceOf[String] //最后结果强转下类型,scala默认是返回AnyRef类型

反射调用 scala object 中的函数


  1. val clazz = Class.forName("com.testobject")


  2. clazz


  3. .getDeclaredMethod(s"$函数名", classOf[String], classOf[String])


  4. .invoke(null, 入参1, 入参2) //相当于调用java的静态成员,直接调用就行不需要再new加载


  5. .asInstanceOf[String]


scala 实现反射:

scala反射需要引包

import scala.reflect.runtime.{universe => ru}

反射调用 scala class 中的函数


val classMirror = ru.runtimeMirror(getClass.getClassLoader) //获取运行时类镜像


  1. val classTest = ClassMirror.reflect(new com.testclass) //获取需要反射的类对象


  2. val methods = ru.typeOf[com.testclass] //构造获取方式的对象


  3. val method = Methods.decl(ru.TermName(s"$函数名")).asMethod //获取需要调用的函数


  4. val result = classTest.reflectMethod(Method)(入参1, 入参2) //反射调用函数,并传入入参


  5. result.asInstanceOf[String] //返回的结果强转下类型,scala默认是AnyRef类型

反射调用 scala object 中的函数


  1. val classMirror = ru.runtimeMirror(getClass.getClassLoader) //获取运行时类镜像


  2. val classTest = classMirror.staticModule("com.testobject") //获取需要反射object


  3. val methods = classMirror.reflectModule(classTest) //构造获取方式的对象


  4. val objMirror = classMirror.reflect(methods.instance) //反射结果赋予对象


  5. val method = methods.symbol.typeSignature.member(ru.TermName(s"$函数名")).asMethod //反射调用函数


  6. val result = objMirror.reflectMethod(method)(入参1, 入参2) //最后带参数,执行这个反射调用的函数


  7. result.asInstanceOf[String]



版权声明:本文为Baron_ND原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。