我有一些带有自定义Java注释的Scala代码...用于监控目的(JMX和ModelMBeanOperationInfo)我想将MethodSymbol转换为Java方法。 仅供参考,这是我的代码,用于检索带注释的方法的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 =>
}
})
感谢。
答案 0 :(得分: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()