Java和scala中反射的实现

 

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

example:

 //1.根据配置获取指标对应的类
    var someTypeClass: Some[String] = parameter.get("serviceClazz").asInstanceOf[Some[String]];
    var serviceClass: String = someTypeClass.value;
    import scala.reflect.runtime.{universe => ru}
    val mirror: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader) //获取运行时类镜像
    val clazz: ru.ModuleSymbol = mirror.staticModule(serviceClass) //获取需要反射的object
    val methods: ru.ModuleMirror = mirror.reflectModule(clazz) //构造获取方式的对象
    val method = methods.symbol.typeSignature.member(ru.TermName("execute")).asMethod //反射调用函数
    val objMirror: ru.InstanceMirror = mirror.reflect(methods.instance) //反射结果赋予对象
    val response = objMirror.reflectMethod(method)(parameter, env) //执行反射调用函数
    //返回元组
    val result = response.asInstanceOf[(ExecutionEnvironment, Map[String, Object], Map[String, DataSet[Row]])]          //强制类型转换成我们需要的数据格式

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

꧁꫞ND꫞꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值