从reflect.runtime.universe.MethodSymbol 获取一个java.lang.reflect.Method [英] Get a java.lang.reflect.Method from a reflect.runtime.universe.MethodSymbol

查看:36
本文介绍了从reflect.runtime.universe.MethodSymbol 获取一个java.lang.reflect.Method的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些带有自定义 Java 注释的 Scala 代码...用于监控目的(JMX 和 ModelMBeanOperationInfo)我想将 MethodSymbol 转换为 Java 方法.仅供参考,这是我为带注释的方法检索 Scala 符号的代码:

I have some Scala code with custom Java annotations... for Monitoring purposes (JMX and ModelMBeanOperationInfo) I would like to convert a MethodSymbol into a Java Method. FYI, this is my code to retrieve the Scala symbols for my annotated methods:

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

谢谢.

推荐答案

目前,公共 API 无法做到这一点,但存在 JIRA 问题:https://issues.scala-lang.org/browse/SI-7317.以下是使用内部 API 的解决方法:

Currently that's impossible to do with the public API, but there's a JIRA issue for that: https://issues.scala-lang.org/browse/SI-7317. Here's a workaround that uses internal APIs:

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

这篇关于从reflect.runtime.universe.MethodSymbol 获取一个java.lang.reflect.Method的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆