java - 如何在 Scala 程序中反射(reflect)字段注释 (Java)?

标签 java scala reflection annotations scala-reflect

我使用的是 Scala 2.13,我知道自旧版本以来,有很多内容已被弃用。

我有这个注释:

@Inherited
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Foo {
    int index() default 0;
}

(我知道...我那里有很多 ElementType,但我很难看到它在反射中出现在哪里,因此希望最大限度地提高命中的机会!)

像这样使用:

case class Person(name: String, @Foo(index = 3) age: Int)
val p = Person("Fred", 29)

我如何反射(reflect)这一点以获得我的Java注释(Foo),这样我就可以1)知道@Foo是否存在于给定字段上,2)获取索引值。请注意,我为 Foo.index 声明了一个默认值,该值可能会在运行时被覆盖,因此这是一个运行时范围的注释。

最佳答案

这是使用 Java 反射的解决方案。

对于 @(Foo @field)(index = 3) 年龄:Int 执行

println(classOf[Person].getDeclaredFields.map(_.getDeclaredAnnotationsByType(classOf[Foo]).map(_.index)).deep)
//Array(Array(), Array(3))

对于 @(Foo @getter)(index = 3) 年龄:Int 执行

println(classOf[Person].getDeclaredMethods.map(_.getDeclaredAnnotationsByType(classOf[Foo]).map(_.index)).deep)
//Array(Array(), Array(), Array(3), Array(), Array(), Array(), Array(), Array(), Array(), Array(), Array(), Array(), Array())

对于 @(Foo @param)(index = 3) Age: Int 或只是 @Foo(index = 3) Age: Int 执行

println(classOf[Person].getDeclaredConstructors.map(_.getParameters.map(_.getDeclaredAnnotationsByType(classOf[Foo]).map(_.index))).deep)
//Array(Array(Array(), Array(3)))

您可以组合元注释@field@getter@param

我想使用 Scala 反射也可以完成类似的事情。

关于java - 如何在 Scala 程序中反射(reflect)字段注释 (Java)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59620528/

相关文章:

java - Android:将文本输入转换为 ASCII 并将其打印为字符串

scala - 如何在 IntelliJ 调试器评估表达式中使用 sparks 隐式转换(例如 $)

C# - 递归/反射属性值

c# - Reflection.Emit 如何分配不兼容的类型?

reflection - 不能在用反射制作的 slice 上使用范围,然后传递 json.Unmarshal

java - 移动目录后 Eclipse 项目无法运行

java - 通过jsp url调用servlet中的函数

java - java中只允许两个或多个连字符的正则表达式?

java - 如何在 MongoDB Java 驱动程序 3 中插入​​文档

scala - Spark : produce RDD[(X, X)] 来自 RDD[X] 的所有可能组合