How do I call a Scala Object method using reflection?

前端 未结 3 814
清歌不尽
清歌不尽 2020-11-30 02:55

say, I have the following:

trait SomeTrait {
  def someMethod: String;
}

object SomeObject extends SomeTrait {
  def someMethod = \"something\";
}


        
相关标签:
3条回答
  • 2020-11-30 03:45
    def companion[T](name : String)(implicit man: Manifest[T]) : T = 
        Class.forName(name + "$").getField("MODULE$").get(man.erasure).asInstanceOf[T]
    
    val result = companion[SomeTrait]("SomeObject").someMethod
    
    0 讨论(0)
  • 2020-11-30 03:46

    Since scala 2.10, we can use the reflection of Module:

    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
    
    0 讨论(0)
  • 2020-11-30 03:50

    For classes, this can be done pretty easily using the standard java reflection classOf method. For Scala objects, it is a bit more work, but it still can be done:

    
    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
    
    0 讨论(0)
提交回复
热议问题