[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.
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.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.클래스의 경우, 이것은 아주 쉽게 표준 자바 반사 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
from https://stackoverflow.com/questions/3039822/how-do-i-call-a-scala-object-method-using-reflection by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라에서 익명 함수에서 매개 변수 전에 암시 적 키워드 (0) | 2019.11.09 |
---|---|
[SCALA] 어떻게 스파크에 dataframe에 JSON 문자열을 변환하는 (0) | 2019.11.09 |
[SCALA] 스칼라의지도를 반전하는 우아한 방법 (0) | 2019.11.08 |
[SCALA] GZIP 형식은 스파크에서 지원됩니까? (0) | 2019.11.08 |
[SCALA] 어떻게 스칼라 특성은 자바 바이트 코드로 컴파일? (0) | 2019.11.08 |