Scala:通过反射从单例对象提取注释

Scala:通过反射从单例对象提取注释,scala,reflection,annotations,Scala,Reflection,Annotations,如何访问给定字符串的单例对象的注释 我正在使用Scala版本2.11.6,并计划在解决此问题后升级到2.12 例子 给定一个(java)注释 public @interface Marked { String name(); } 以及简化的工厂界面 trait Instance { def doSomething(): Unit } trait Factory { def create(): Instance } 我想检查一个动态加载的singleton对象是否被注释,并使用什么值。si

如何访问给定字符串的单例对象的注释

我正在使用Scala版本2.11.6,并计划在解决此问题后升级到2.12

例子 给定一个(java)注释

public @interface Marked {
  String name();
}
以及简化的工厂界面

trait Instance { def doSomething(): Unit }
trait Factory { def create(): Instance }
我想检查一个动态加载的singleton对象是否被注释,并使用什么值。singleton对象将放在类路径中,并且可以这样定义:

class A extends Instance { override def doSomething() { println("A is done.") } }

@Marked(name = "My A Factory")
object AFactory extends Factory {
  override def create(): Instance = new A()
}
我试过的 我只能动态访问模块(单例对象),这样就无法访问注释。主要是由于缺乏全面的文档,我尝试了以下表达式,它们都以某种方式返回一个空列表

import scala.reflect.runtime.{universe => ru}
val name = "AFactory$" // This is automatically provided.
val rm = ru.runtimeMirror(getClass.getClassLoader)

val classSym = rm.staticClass(name)
println(classSym.annotations)
println(classSym.companion.annotations)
println(classSym.baseClasses(0).annotations)
println(classSym.baseClasses(0).companion.annotations)

val moduleSym = rm.staticModule(name)
println(moduleSym.companion.annotations)
println(moduleSym.asModule.annotations)
println(moduleSym.asModule.moduleClass.annotations)
println(moduleSym.asModule.moduleClass.companion.annotations)

您需要让JVM在运行时保留注释,否则它将无法工作=>

@Retention(RetentionPolicy.RUNTIME)
public @interface Marked {
}
通过此更改,您的代码可以正常工作。 编辑:
原因是,默认保留为“Class”,这将使编译器在类文件中保留注释,但在运行时无法访问该注释。

请注意,Scala注释在运行时将永远不可见