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]])] //强制类型转换成我们需要的数据格式