How do I call a Scala Object method using reflection?

前端 未结 3 821
清歌不尽
清歌不尽 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: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
    

提交回复
热议问题