Нахождение перегруженного метода с использованием Scala Reflections - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь найти перегруженный метод, используя отражения Scala. Вот мой код

import scala.reflect.runtime.universe._

object Example {

  class Something {
    def printIt(s1: String,s2: String) {println(s1 + s2) }
    def printIt(s: Int) { println(s) }
    def printIt(s: String) {println(s) }
    def printInt(i: Int) { println(i) }
    def printInt(i: String) { println(i) }
  }

  def main(args: Array[String]): Unit = {

    val r = new Something()

    val mirror = runtimeMirror(getClass.getClassLoader)
    val instanceMirror = mirror.reflect(r)
    val symbols = mirror.typeOf[r.type].decl(TermName("printInt")).asMethod

  }
}

Когда я выполняю код, я получаю следующее исключение.

Exception in thread "main" scala.ScalaReflectionException: value printInt encapsulates multiple overloaded alternatives and cannot be treated as a method. Consider invoking `<offending symbol>.asTerm.alternatives` and manually picking the required method

Следуя предложению самого исключения, я могу найти перегруженный метод, перебирая альтернативы метода. Но есть ли способ найти метод, используя типы аргументов, которые принимает метод?

1 Ответ

0 голосов
/ 29 июня 2018

Либо с использованием отражения Scala и итерации

val m: scala.reflect.runtime.universe.MethodSymbol = 
  typeOf[Something].decl(TermName("printInt")).asTerm.alternatives.find(s => 
    s.asMethod.paramLists.map(_.map(_.typeSignature)) == List(List(typeOf[Int]))
  ).get.asMethod

или с использованием отражения Java

val m: java.lang.reflect.Method = 
  Class.forName("Example$Something").getMethod("printInt", classOf[Int])
...