从scala访问Java字段注释

从scala访问Java字段注释,java,scala,reflection,Java,Scala,Reflection,我有以下代码(大部分代码只是来自另一个SE问题,): 这是可行的,但现在我得到的“注释”只有一个方法:tree()。如何获取InjectExt.id()? 而且,通过toString()进行过滤看起来确实是一种解决方法,但我似乎没有任何isVariable或类似的工具可以使用。使用纯Java反射,您可以轻松地获得所需的内容。我发现Scala反射过于复杂 object Test { class SomeClass { @InjectExt(id = "someCoolId") val

我有以下代码(大部分代码只是来自另一个SE问题,):

这是可行的,但现在我得到的“注释”只有一个方法:tree()。如何获取InjectExt.id()?

而且,通过toString()进行过滤看起来确实是一种解决方法,但我似乎没有任何isVariable或类似的工具可以使用。

使用纯Java反射,您可以轻松地获得所需的内容。我发现Scala反射过于复杂

object Test {
  class SomeClass {
    @InjectExt(id = "someCoolId") val myMember = 2
    @InjectExt(id = "someOtherCoolId") val myOtherMember = 2
  }

  def getFieldId(fieldName: String, someInstance: SomeClass): String = {
    val myMember = someInstance.getClass.getDeclaredField(fieldName)
    myMember.getDeclaredAnnotation(classOf[InjectExt]).id()
  }

  def main(args: Array[String]): Unit = {
    println(getFieldId("myMember", new SomeClass))
    println(getFieldId("myOtherMember", new SomeClass))
  }
}
输出:

someCoolId
someOtherCoolId

如果我是你,我会避免使用Scala反射,除非我不能用Java反射做我想做的事情。

我同意,做一些简单的反射看起来非常粗糙和复杂。您的最终目标是什么?我有一个对象,对于该对象中具有InjectExt注释的每个字段,我希望将该字段的值设置为由InjectExt中的“id”字符串确定的对象。如果是“auto”,则应该由字段类型确定(字段被定义为@InjectExt var whatever:TExtExample=389;),在这种情况下,它将被设置为TExtExample的实例(我只需要TExtExample类,因为我已经获得了生成新对象的代码)@Dici这是我使用Java反射编写的代码,但它不起作用,因为使用Java反射时注释不在那里。假设注释来自具有运行时保留策略的Java,那么您应该能够使用Java反射代码非常轻松地访问它(获取
方法
对象,然后在
getAnnotations
getDeclaredAnnotations
中查找注释,具体取决于您的用例)我修改了我的代码以获取所有方法,并对它们的注释进行过滤,但它们在第二行再次被过滤掉:这很有效!getDeclaredAnnotations()没有列出注释,但是getDeclaredAnnotations()列出了注释!
object Test {
  class SomeClass {
    @InjectExt(id = "someCoolId") val myMember = 2
    @InjectExt(id = "someOtherCoolId") val myOtherMember = 2
  }

  def getFieldId(fieldName: String, someInstance: SomeClass): String = {
    val myMember = someInstance.getClass.getDeclaredField(fieldName)
    myMember.getDeclaredAnnotation(classOf[InjectExt]).id()
  }

  def main(args: Array[String]): Unit = {
    println(getFieldId("myMember", new SomeClass))
    println(getFieldId("myOtherMember", new SomeClass))
  }
}
someCoolId
someOtherCoolId