Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java方法获取Scala注释_Java_Scala_Methods_Reflection_Annotations - Fatal编程技术网

从Java方法获取Scala注释

从Java方法获取Scala注释,java,scala,methods,reflection,annotations,Java,Scala,Methods,Reflection,Annotations,我有一个JavaMethod的实例,它表示带有Scala注释的Scala函数(扩展了StaticAnnotation)。我知道我可以使用Method.getAnnotation(classOf[SomeJavaAnnotation])来获取Java注释,但对于Scala注释,这将返回null 如何从中获取Scala注释?似乎我需要首先将其转换为ScalaMethodSymbol,但我没有看到一个明显的方法,我只看到了显示如何转换的参考资料(从ScalaMethodSymbol到JavaMetho

我有一个Java
Method
的实例,它表示带有Scala注释的Scala函数(扩展了
StaticAnnotation
)。我知道我可以使用
Method.getAnnotation(classOf[SomeJavaAnnotation])
来获取Java注释,但对于Scala注释,这将返回
null


如何从中获取Scala注释?似乎我需要首先将其转换为Scala
MethodSymbol
,但我没有看到一个明显的方法,我只看到了显示如何转换的参考资料(从Scala
MethodSymbol
到Java
Method

或者

  • 使用Java注释(带有运行时保留策略),它们将对Java反射可见,或者

  • 使用时,可以查看Scala注释


这就是如何将
java.lang.reflect.Method
转换为
scala.reflect.runtime.universe.MethodSymbol

import java.lang.reflect.Method
导入scala.reflect.runtime
导入scala.reflect.runtime.universe_
def methodToMethodSymbol(方法:方法):方法符号={
val runtimeMirror=runtime.currentmrror
val classSymbol=runtimeMirror.classSymbol(方法.getDeclaringClass)
classSymbol.typeSignature.decl(TermName(method.getName)).asMethod/(*)
}
如果该方法存在重载版本,则必须替换 行(*) 与

classSymbol.typeSignature.decl(TermName(method.getName)).alternations.find(
_.asMethod.paramLists.flatte.map(uu.typeSignature.erasure.typeSymbol.asClass)=
方法.getParameterTypes.map(runtimeMirror.classSymbol).toList
).get.asMethod
另一个实施:

def methodToMethodSymbol(方法:方法):方法符号={
val runtimeMirror=runtime.currentmrror
val castedruntimemiror=runtimeMirror.asInstanceOf[{
def methodToScala(meth:Method):scala.reflect.internal.Symbols#MethodSymbol
}]
castedRuntimeMirror.methodToScala(方法).asInstanceOf[MethodSymbol]
}
测试:

类myAnnotation扩展了StaticAnnotation
类MyClass{
@myAnnotation
def myMethod(i:Int):单位=()
}
val clazz=classOf[MyClass]
val method=clazz.getMethod(“myMethod”,classOf[Int])
val methodSymbol=methodToMethodSymbol(method)//方法myMethod
methodSymbol.annotations//List(myAnnotation)

以防万一,这里是将
scala.reflect.runtime.universe.MethodSymbol
反向转换为
java.lang.reflect.Method

def methodsymboltmethod(methodSymbol:methodSymbol):方法={
val runtimeMirror=runtime.currentmrror
val classSymbol=methodSymbol.owner.asClass
val clazz=runtimeMirror.runtimeClass(classSymbol)
val paramClasses=methodSymbol.ParamList.Flatte.map(paramSymbol=>
runtimeMirror.runtimeClass(paramSymbol.typeSignature.erasure)
)
clazz.getMethod(methodSymbol.name.toString,paramClass:*)
}
另一个实施:

def methodsymboltmethod(methodSymbol:methodSymbol):方法={
键入InternalMethodSymbol=scala.reflect.internal.Symbols#MethodSymbol
val runtimeMirror=runtime.currentmrror
val castedruntimemiror=runtimeMirror.asInstanceOf[{
def methodToJava(sym:InternalMethodSymbol):方法
}]
castedRuntimeMirror.methodToJava(
methodSymbol.asInstanceOf[InternalMethodSymbol]
)
}

是否可以在Java
方法上执行Scala反射?我只能访问
方法
实例。谢谢!我能够通过
methodSymbol.annotations.find(u.tree.tpe==typeOf[MyAnnotation])获得我想要的注释。