Reflection 如何使用反射调用Scala对象方法?

Reflection 如何使用反射调用Scala对象方法?,reflection,scala,object,Reflection,Scala,Object,比如,我有以下几点: trait SomeTrait { def someMethod: String; } object SomeObject extends SomeTrait { def someMethod = "something"; } 我想使用反射调用“someMethod”,因为我将对象名作为字符串。 比如: val objectName = "SomeObject" val someTrait:SomeTrait = ???.asInstanceOf[SomeT

比如,我有以下几点:

trait SomeTrait {
  def someMethod: String;
}

object SomeObject extends SomeTrait {
  def someMethod = "something";
}
我想使用反射调用“someMethod”,因为我将对象名作为字符串。 比如:

val objectName = "SomeObject"  
val someTrait:SomeTrait = ???.asInstanceOf[SomeTrait]  
someTrait.someMethod
或者类似的东西


感谢类,使用标准java reflection classOf方法可以非常轻松地完成这项工作。对于Scala对象,这需要做更多的工作,但仍然可以做到:


trait SomeTrait { def someMethod: String}
object SomeObject extends SomeTrait { def someMethod = "something"}

class SomeClass extends SomeTrait { def someMethod = "something"}

object Main {
 def main(args:Array[String]) = {
    val someClassTrait:SomeTrait = Class.forName("SomeClass").newInstance().asInstanceOf[SomeTrait]
    println("calling someClassTrait: " + someClassTrait.someMethod)
    val objectName = "SomeObject$"
    val cons = Class.forName(objectName).getDeclaredConstructors(); 
    cons(0).setAccessible(true);
    val someObjectTrait:SomeTrait = cons(0).newInstance().asInstanceOf[SomeTrait]
    println("calling someObjectTrait: " + someObjectTrait.someMethod)
  }
}

//prints:
calling someClassTrait: something
calling someObjectTrait: something

自scala 2.10以来,我们可以使用模块的反射:

import scala.reflect.runtime.universe

val runtimeMirror = universe.runtimeMirror(getClass.getClassLoader)
val module = runtimeMirror.staticModule("SomeObject")
val obj = runtimeMirror.reflectModule(module)
val someTrait:SomeTrait = obj.instance.asInstanceOf[SomeTrait]  
someTrait.someMethod

我认为如果你创建一个新的实例,它确实打破了客户对它的期望。这正是我想要的。托马斯-那是真的。但是你可以把代码包装在一个对象工厂中,自己提供单例行为,这样更好。谢谢,托马斯。你需要舱单吗?我发现
Class.forName(name+“$”).getField(“MODULE$”).get(null)
就足够了。静态字段允许这样做。它如何在2.10中转换为反射?使用Scala 2.10.2,我的代码在
Class.forName(name+“$”).getField(“MODULE$”)
@Thomas Jung上抛出了一个异常,这里的“$”是什么,它也指什么,对不起,我是Scala的新手。
import scala.reflect.runtime.universe

val runtimeMirror = universe.runtimeMirror(getClass.getClassLoader)
val module = runtimeMirror.staticModule("SomeObject")
val obj = runtimeMirror.reflectModule(module)
val someTrait:SomeTrait = obj.instance.asInstanceOf[SomeTrait]  
someTrait.someMethod