2012-03-23 5 views
0

임의의 문자열에서 클래스를 만들고 "render"라는 고정 메서드에 매개 변수 배열을 전달하는 함수를 만들어야합니다. 문제는 클래스에 따라 "render"메서드가 다양한 양의 인수를 사용할 수 있다는 것입니다. 불행히도 "render"메서드는 varargs를 받아들이도록 변경할 수 없으므로 여전히 인수를 Array로 전달할 수 있는지 궁금합니다.리플렉션을 통해 호출 된 메서드에 임의의 인수 배열 전달

이 수율 : 여기

"java.lang.IllegalArgumentException가 인수 잘못된 번호는"코드입니다 :

def perform(strClazz: String, pTypes: Array[Class[_]], params: Array[Object]) = { 
    val clazz = MyClassLoader.loadClass(strClazz) 
    val render = clazz.getDeclaredMethod("render", pTypes: _*) 
    // params: java.lang.IllegalArgumentException: wrong number of arguments 
    render.invoke(clazz, params) 
} 

그리고 나는 통해 전화 :

perform("MyClass",Array[Class[_]](classOf[String], classOf[String]),Array[Any]("first", "second")) 

호출 된 메소드 두 문자열을 인수로 사용하므로 다음과 같이 작동합니다.

render.invoke(clazz, "first", "second") 

그러면 배열을 전달할 수 있습니까?

+1

params.asInstanceOf [Array [Object]] : _ * 트릭을 수행합니다. – recalcitrant

답변

2
scala> class Foo { def f(s: String, i: Int): Unit =() } 
defined class Foo 

scala> classOf[Foo].getDeclaredMethod("f", Array(classOf[String], classOf[Int]):_*) 
res0: java.lang.reflect.Method = public void Foo.f(java.lang.String,int) 
관련 문제