【问题标题】:Get a java.lang.reflect.Method from a reflect.runtime.universe.MethodSymbol从 reflect.runtime.universe.MethodSymbol 获取 java.lang.reflect.Method
【发布时间】:2015-02-18 04:26:53
【问题描述】:

我有一些带有自定义 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 =>
  }
})

谢谢。

【问题讨论】:

    标签: scala


    【解决方案1】:

    目前这对于公共 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()
    

    【讨论】:

    • 谢谢尤金。像魅力一样工作。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多