scala - 委托实现设计模式(没有反射?)

时间:2016-12-09 16:11:23

标签: java scala design-patterns

我想公开一个公共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。

感谢您的帮助

0 个答案:

没有答案