gpt4 book ai didi

java - 使用 Scala 反射返回类型化函数

转载 作者:行者123 更新时间:2023-11-30 02:26:13 25 4
gpt4 key购买 nike

我正在构建一个由 xml 动态驱动的引擎。我希望能够保持引擎代码精简,并让其他团队放入 jar 中,我可以使用他们的类/对象和方法。使用反射,我可以动态调用方法,但不能将它们作为第一类函数传递。有没有办法在 scala 中返回类型化的反射方法?我认为这与类型删除有关,但我不确定。谢谢!

Main.scala

import scala.reflect.runtime.{universe => ru}

object Main {
def reflectFoo(str: String): (Int) => Boolean = {
val m = ru.runtimeMirror(getClass.getClassLoader)
val module = m.staticModule("Reflect")
val im = m.reflectModule(module)
val method = im.symbol.info.decl(ru.TermName(str)).asMethod
val objMirror = m.reflect(im.instance)
val foo = objMirror.reflectMethod(method)
println(foo(10))
foo.asInstanceOf[(Int) => Boolean]
}

def main(args: Array[String]): Unit = {
reflectFoo("foo")
}
}

Reflect.scala

object Reflect {
def foo(i: Int): Boolean = i % 2 == 0
}

输出

true
Exception in thread "main" java.lang.ClassCastException: scala.reflect.runtime.JavaMirrors$JavaMirror$JavaVanillaMethodMirror1 cannot be cast to scala.Function1
at Main$.reflectFoo(Main.scala:12)
at Main$.main(Main.scala:16)
at Main.main(Main.scala)

最佳答案

当你调用objMirror.reflectMethod(methodSymbol)时,你会得到一个MethodMirror,它是无类型的,并且什么都没有Function(或删除,就此而言)有关。这就是你的 Actor 失败的原因。不过,它支持 apply(Any*): Any,这就是为什么您可以将其作为函数调用,即使它不是 Function。您需要在函数文字中自己创建函数

val method = ??? // As above
val objMirror = ???
val foo = objMirror.reflectMethod(method)
println(foo(10))
val func: Int => Boolean = { (i: Int) => foo(i).asInstanceOf[Boolean] }

关于java - 使用 Scala 反射返回类型化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45596889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com