복붙노트

[SCALA] 어떻게 반사를 사용하여 스칼라 객체 메소드를 호출합니까?

SCALA

어떻게 반사를 사용하여 스칼라 객체 메소드를 호출합니까?

말하자면, 나는 다음이있다 :

trait SomeTrait {
  def someMethod: String;
}

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

내가 문자열로 개체 이름을 가지고 반사를 사용하여 "것으로 someMethod"전화를하고 싶습니다. 뭔가 같은 :

val objectName = "SomeObject"  
val someTrait:SomeTrait = ???.asInstanceOf[SomeTrait]  
someTrait.someMethod

유사하거나 뭔가.

감사

해결법

  1. ==============================

    1.

    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
    
  2. ==============================

    2.스칼라 2.10 이후, 우리는 모듈의 반사를 사용할 수 있습니다 :

    스칼라 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
    
  3. ==============================

    3.클래스의 경우, 이것은 아주 쉽게 표준 자바 반사 classOf 방법을 사용하여 수행 할 수 있습니다. 스칼라 객체의 경우, 조금 더 많은 작업이지만, 여전히 수행 할 수 있습니다 :

    클래스의 경우, 이것은 아주 쉽게 표준 자바 반사 classOf 방법을 사용하여 수행 할 수 있습니다. 스칼라 객체의 경우, 조금 더 많은 작업이지만, 여전히 수행 할 수 있습니다 :

    
    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
    
  4. from https://stackoverflow.com/questions/3039822/how-do-i-call-a-scala-object-method-using-reflection by cc-by-sa and MIT license