Конвертировать Scala Reflection MethodMirror в функцию Scala - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь создать Seq методов, которые будут работать с Spark DataFrame.В настоящее время я явно создаю этот Seq во время выполнения:

val allFuncs: Seq[DataFrame => DataFrame] = Seq(func1, func2, func3)
def func1(df: DataFrame): DataFrame = {}
def func2(df: DataFrame): DataFrame = {}
def func3(df: DataFrame): DataFrame = {}

Я добавил функциональность, которая позволяет разработчикам добавлять аннотацию, и я создаю из нее Seq of MethodMirrors, но мне бы хотелось getMyFuncs чтобы вернуть Seq[(DataFrame => DataFrame)]:

  def getMyFuncs(): Seq[(DataFrame => DataFrame)] = {
    // Gets anything with the @MyFunc annotation
    val listOfAnnotations = typeOf[T].members.flatMap(f => f.annotations.find(_.tree.tpe =:= typeOf[MyFunc]).map((f, _))).toList
    val rm = runtimeMirror(this.getClass.getClassLoader)
    val instanceMirror = rm.reflect(this)
    listOfAnnotations.map(annotation =>   instanceMirror.reflectMethod(annotation._1.asMethod)).toSeq
}

@MyFunc
def func1(df: DataFrame): DataFrame = {}
@MyFunc
def func2(df: DataFrame): DataFrame = {}
@MyFunc
def func3(df: DataFrame): DataFrame = {}

Однако, Seq, возвращаемый getMyFuncs, равен Seq[reflect.runtime.universe.MethodMirror], а не Seq[(DataFrame => DataFrame)].Что ожидается, но не выход, который мне нужен.Есть ли способ преобразовать MethodMirrors в функцию Scala?

1 Ответ

0 голосов
/ 31 января 2019

Попробуйте сопоставить:

val getMyFuncs: Seq[reflect.runtime.universe.MethodMirror] = ???
val getMyFuncs1: Seq[DataFrame => DataFrame] = 
  getMyFuncs.map(mirror => (dataFrame: DataFrame) => mirror(dataFrame).asInstanceOf[DataFrame])

т.е. создать лямбды вручную, используя reflect.runtime.universe.MethodMirror#apply(..).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...