gpt4 book ai didi

scala - 从 reflect.runtime.universe.MethodSymbol 获取 java.lang.reflect.Method

转载 作者:行者123 更新时间:2023-12-04 20:05:24 24 4
gpt4 key购买 nike

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

谢谢。

最佳答案

目前,使用公共(public) 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()

关于scala - 从 reflect.runtime.universe.MethodSymbol 获取 java.lang.reflect.Method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16787163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com