2013-05-28 23 views
3

我有一些帶自定義Java註釋的Scala代碼...用於監視目的(JMX和ModelMBeanOperationInfo)我想將MethodSymbol轉換爲Java方法。 僅供參考,這是我的代碼來檢索Scala的符號,我的註解的方法:從reflect.runtime.universe.MethodSymbol獲取java.lang.reflect.Method

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 => 
    } 
}) 

感謝。

回答

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() 
+0

謝謝尤金。奇蹟般有效。 – jts