如何解决如何在运行时的Scala / Java中找到带注释的方法
我想将运行时反射与Scala注释一起使用(必要时也可以是Java注释,但我希望限制纯Java代码)
我想实现类似的东西:
/**
print all methods that implement a specific annotation
*/
def getAllAnnotated(): Unit {...}
例如,如果我有:
class Foo {
@printme
def foo(args: A): R
def oof(args: A): R
}
class Bar {
@printme
def bar(): Unit
}
运行getAllAnnotated()
的结果类似于:
Foo.foo
Bar.bar
请注意,我不想查看特定的类,而是要查看任何可用的方法
解决方法
尝试基于Java反射(例如Reflections)和scala-reflect的类路径扫描器之一。由于我们仅使用Java反射来查找类,而使用scala-reflect来寻找带注释的方法,因此注释可以用Scala编写。
import org.reflections.Reflections
import org.reflections.scanners.SubTypesScanner
import org.reflections.util.{ClasspathHelper,ConfigurationBuilder}
import scala.annotation.StaticAnnotation
import scala.jdk.CollectionConverters._
import scala.reflect.runtime.currentMirror
import scala.reflect.runtime.universe._
class printme extends StaticAnnotation
val reflections = new Reflections(
(new ConfigurationBuilder)
.setUrls(ClasspathHelper.forPackage(""))
.setScanners(new SubTypesScanner(false))
)
def getAllAnnotated(): Unit =
reflections.getAllTypes.asScala
.flatMap(className =>
currentMirror.classSymbol(Class.forName(className))
.toType
.decls
.filter(symbol =>
symbol.isMethod && symbol.annotations.exists(_.tree.tpe =:= typeOf[printme])
)
.map(method => s"$className.${method.name}")
).foreach(println)
反射库的替代例为ClassGraph和Burningwave。如果我们将scala-reflect替换为Java反射,那么注释就必须用Java编写,因为只有Java编写的注释才能在运行时通过Java反射可见。
,在Java中,您可以使用反射使用包扫描类中的包类,以获取包中的所有类,然后递归地进入所有类中以查找批注。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。