我想公开一个公共API(一种Runnable)并让用户实现它,然后针对我们的服务器执行该代码(给定包含要运行的代码的类名)。用户提供了一个包含其实现的jar,不应该访问实现细节。
以下是说明问题的摘录。
公开API:
package mypackage
trait MyTrait {
def run(i: Int) : Unit
}
示例用户的实施:
package mypackage
object MyImpl extends MyTrait {
override def run(i : Int) : Unit = {
println(i)
}
}
运行用户代码的服务器端代码:
package mypackage
import scala.reflect.runtime.{universe => ru}
object MyTest extends App {
val m = ru.runtimeMirror(getClass.getClassLoader)
val module = m.staticModule("mypackage.MyImpl")
val im = m.reflectModule(module)
val method = im.symbol.info.decl(ru.TermName("run")).asMethod
val objMirror = m.reflect(im.instance)
objMirror.reflectMethod(method)(42)
}
上面的代码有效(打印“42”),但对我来说设计似乎很难看。
此外,它似乎不安全(类而不是对象,对象不存在或未实现正确的接口)。
实现这一目标的最佳方式是什么?
我正在使用Scala 2.11.8。
感谢您的帮助