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)
等等,希望对您有所帮助。
我正在尝试使用 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)
等等,希望对您有所帮助。