Как я могу отразить аннотацию поля (Java) в программе Scala? - PullRequest
0 голосов
/ 07 января 2020

Я использую Scala 2.13 и знаю, что со старых версий это сильно устарело.

У меня есть эта аннотация:

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

(я знаю .. У меня там много ElementTypes, но я изо всех сил пытаюсь понять, где это всплывает в отражении, поэтому хотел максимально увеличить мои шансы на попадание!)

Используется так:

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

Как я могу подумать об этом, чтобы получить мою Java Аннотация (Foo), чтобы я мог 1) узнать, существует ли @Foo в данном поле, и 2) получить значение индекса. Примечание. У меня есть объявленное значение по умолчанию для Foo.index, которое может быть переопределено во время выполнения, так что это аннотация области действия.

1 Ответ

0 голосов
/ 08 января 2020

Вот решение с использованием Java отражения.

Для @(Foo @field)(index = 3) age: Int до

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

Для @(Foo @getter)(index = 3) age: 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 do

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

Вы можете комбинировать метааннотации @field, @getter, @param.

Я думаю, что подобное можно сделать с помощью Scala отражение.

...