使用scala.reflect.runtime.universe动态调用Scala中的对象方法?

时间:2013-11-30 13:03:18

标签: scala reflection

我想在运行时动态执行以removeAt对象X开头的方法。

如何使用REFLECTION Environment, Universes, and Mirrors

中描述的scala.reflect.runtime.universe API执行此操作

1 个答案:

答案 0 :(得分:1)

以下是您的问题的解决方案:

object X { 
   def aa = 1 
   def ab = 2
   def removeAtX = 3
   def bb = 4
   def removeAtY = 5 
}

val ru = scala.reflect.runtime.universe
val m = ru.runtimeMirror(getClass.getClassLoader)
val im = m.reflect(X)
val l = X.getClass.getMethods.map(_.getName).filter(_ startsWith "removeAt")
val r = l.map(y => ru.typeOf[X.type].declaration(ru.newTermName(y)).asMethod).map(im.reflectMethod(_).apply())

结果:

r: scala.collection.mutable.ArraySeq[Any] = ArraySeq(3, 5)