【发布时间】:2016-08-25 00:09:38
【问题描述】:
我有一个类名和一个我知道其类型参数的方法,我想通过反射调用这个方法。
在java中我会做类似的事情:
Class.forName("foo").getMethod("name", ... type args...).invoke(null, ..args)
但是在 Scala 中,每当我尝试调用时,都会收到 null ref 错误。
我正在使用 scala 2.10.4
-- 编辑
我试过了:
$ scala
Welcome to Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_102).
Type in expressions to have them evaluated.
Type :help for more information.
scala> class Foo { def bar(x: Int) = x }
defined class Foo
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> val foo = new Foo
foo: Foo = Foo@2db7a79b
scala> runtimeMirror(getClass.getClassLoader).reflect(foo)
res0: reflect.runtime.universe.InstanceMirror = instance mirror for Foo@2db7a79b
scala> res0.symbol.typeSignature.member(newTermName("bar"))
res1: reflect.runtime.universe.Symbol = method bar
scala> res0.reflectMethod(res1.asMethodSymbol)(42)
<console>:15: error: value asMethodSymbol is not a member of reflect.runtime.universe.Symbol
res0.reflectMethod(res1.asMethodSymbol)(42)
^
作为"Dynamic" method invocation with new Scala reflection API 的示例,它似乎不再起作用了
这是我正在尝试做的测试:
object Test{
def run(): Boolean = true
}
class InvokeTests extends FlatSpec with Matchers {
"invoke" should "do" in {
import scala.reflect.runtime.universe._
val mirror = runtimeMirror(this.getClass.getClassLoader)
val moduleSymbol = mirror.moduleSymbol(Class.forName(Test.getClass.getName))
val reflected = mirror.reflect(moduleSymbol)
val methodName = reflected.symbol.typeSignature.member(newTermName("run"))
reflected.reflectMethod(methodName.asMethod)() shouldBe true
}
}
【问题讨论】:
-
这里有一个答案:stackoverflow.com/questions/11062166/… 在答案中有一个链接也可以通过反射 api 到达伴随对象。
-
嗯,@Samar 这个例子似乎不起作用(也许自 scala 版本以来发生了变化?)
-
请检查答案。它适用于 Scala 2.11.8
标签: scala