コンパニオンオブジェクトの取得

だいぶ後になっての追記
2.10.0以降はマクロでできるらしい




これでいいのか?
これだと取得した中身はコンパニオンのクラスの実態になってても、そのメソッド(リフレクション使わないと)呼び出せない?

/**
 * @param className (コンパニオンではない)classの名前
 */
def getCompanion[T]( className:String ):T = {
  Class.forName( className +"$" ).getField("MODULE$").get(null).asInstanceOf[T]
}

追記
リフレクションで呼び出すとしたらこんな感じか?

  /** コンパニオンオブジェクトのメソッドを、リフレクション使って呼び出す
   * @param className 呼び出すmethodがあるobject名
   * @param methodName メソッドの名前
   * @param params (パラメータの型、実際のパラメータ) の要素2のTupleの可変長
   */
  private def invokeCompanionMethod[B]( className:String ,methodName :String , params:(Class[_],AnyRef) *  ):B = {
    val clazz = Class.forName( className +"$" ) //コンパニオンのクラスのClassを取得
    val obj = clazz.getField("MODULE$").get(null) // MODULE$というstaticなfieldにインスタンスが保持されているはずなので、それを取得
    val method = clazz.getMethod( methodName , params.map{_._1} : _* ) //呼び出すMethodのオブジェクトを取得
    method.invoke( obj , params.map{_._2} : _*  ).asInstanceOf[B] //メソッドをリフレクション使って呼び出す
  }