3

カスタム Java アノテーションを含む Scala コードがいくつかあります...監視目的 (JMX および ModelMBeanOperationInfo)のために、 MethodSymbol を Java Method に変換したいと考えています。参考までに、これは注釈付きメソッドの Scala シンボルを取得するための私のコードです。

val jmxannotation = ru.typeOf[EnableForMonitoring]
val m = runtimeMirror(getClass.getClassLoader)
val mSymbol = m.classSymbol(jmxe.getClass)
val mType = mSymbol.selfType
mType.declarations.foreach(symbol => {
  symbol.annotations.find(a => a.tpe == jmxannotation) match {
    case Some(_) => {
      info(s"(A) For $symbol on $jmxe, annotated for monitoring")
      val ms = symbol.asMethod
      // TODO: HOW TO CONVERT ms to a Java Method
    }
    case None =>
  }
})

ありがとう。

4

1 に答える 1

6

現在、パブリック API でこれを行うことは不可能ですが、そのための JIRA の問題があります: https://issues.scala-lang.org/browse/SI-7317。内部 API を使用する回避策を次に示します。

scala> class C { def foo = 2 }defined class C

scala> val foo = typeOf[C].declarations.toList.apply(1).asMethod
foo: reflect.runtime.universe.MethodSymbol = method foo

scala> val cm = runtimeMirror(getClass.getClassLoader)
cm: reflect.runtime.universe.Mirror = JavaMirror...

scala> val cmx = cm.asInstanceOf[{
    def methodToJava(sym: scala.reflect.internal.Symbols#MethodSymbol): java.lang.reflect.Method
}]
cmx: AnyRef{def methodToJava(sym: scala.reflect.internal.Symbols#MethodSymbol): java.lang.reflect.Method} = JavaMirror ...

scala> cmx.methodToJava(
    foo.asInstanceOf[scala.reflect.internal.Symbols#MethodSymbol]
)
res1: java.lang.reflect.Method = public int C.foo()
于 2013-05-28T12:21:53.140 に答える