Scala:反射 API 调用两个同名方法之一

Scala: Reflection APIs to call one of the two methods with the same name

我正在尝试使用 Scala 反射 API 来调用两个同名方法之一。唯一的区别是其中一个接受争论而另一个不接受。我想调用不带任何参数的那个。我正在尝试这样的事情:

  val ru = scala.reflect.runtime.universe
  val rm = ru.runtimeMirror(getClass.getClassLoader)
  val instanceMirror = rm.reflect(myInstance)
  val methodSymbol = instanceMirror.symbol.typeSignature.member(ru.TermName("getXyzMethod")).asTerm.alternatives

  if (methodSymbol != null && methodSymbol.nonEmpty) {
    try {
      val method = instanceMirror.reflectMethod(methodSymbol.head.asMethod)
      val value = method()
      }
    } catch {
      case e: java.lang.IndexOutOfBoundsException =>
        val method = instanceMirror.reflectMethod(methodSymbol.last.asMethod)
        val value = method()

      case e: Exception =>
    }
  }

这可行,但如您所见,这有点难看。这样做的原因是 'methodSymbol' 是一个列表,其中我想要的方法 有时在 'head' 位置,有时在 'last' 位置。

如何使用 Scala 反射 API 仅获取我想要的没有参数的方法?

你可以这样做:

  val ru: JavaUniverse = scala.reflect.runtime.universe
  val rm: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader)
  val instanceMirror: ru.InstanceMirror = rm.reflect(myInstance)

  val methodSymbol: Seq[ru.Symbol] =
    instanceMirror.symbol.typeSignature.member(ru.TermName("getXyzMethod")).asTerm.alternatives
  val maybeMethods: Try[ru.MethodSymbol] = Try(methodSymbol.map(_.asMethod).filter(_.paramLists.flatten.isEmpty).head)


  val result: ru.MethodMirror = maybeMethods match {
    case Failure(exception) => //do something with it
      throw new Exception(exception)
    case Success(value) => instanceMirror.reflectMethod(value)
  }

  println(result)

这将始终 return 没有参数的方法。

像这样:

def getXyzMethod() = ???

def getXyzMethod = ???

如果该方法有更多参数,请调整序列的大小,所以如果您想要的方法恰好有 1 个参数:

val maybeMethods: Try[ru.MethodSymbol] = Try(methodSymbol.map(_.asMethod).filter(_.paramLists.flatten.size==1).head)

等等,希望对您有所帮助。