Почему getAnnotatedParameterTypes не видит аннотации для типа массива? - PullRequest
0 голосов
/ 28 июня 2018

Почему-то я не понимаю, почему этот код печатает true и false, что особенного в массиве, что он не включает эту аннотацию здесь?

Работает как положено, если вы используете getParameters.

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE, ElementType.PARAMETER})
@interface Lel {
}

class Test {
    public static void a(@Lel String args) {}
    public static void b(@Lel String[] args) {}

    public static void main(String[] args) throws Exception {
        System.out.println(Test.class.getDeclaredMethod("a", String.class)
            .getAnnotatedParameterTypes()[0].isAnnotationPresent(Lel.class));
        System.out.println(Test.class.getDeclaredMethod("b", String[].class)
            .getAnnotatedParameterTypes()[0].isAnnotationPresent(Lel.class));
    }
}

1 Ответ

0 голосов
/ 28 июня 2018

В аннотированном типе @Lel String[] аннотация применяется к типу элемента String. Чтобы аннотировать тип массива, вы должны использовать String @Lel [].

JLS содержит несколько примеров, подобных этому, в §9.7.4 :

Примечания типа могут применяться к типу массива или любому его типу компонента ( §10.1 ). Например, если предположить, что A, B и C являются типами аннотаций, мета-аннотированными с помощью @Target(ElementType.TYPE_USE), то с учетом объявления поля:

@C int @A [] @B [] f;

@A применяется к типу массива int[][], @B применяется к типу его компонента int[], а @C применяется к типу элемента int. Дополнительные примеры см. §10.2 .

Важным свойством этого синтаксиса является то, что в двух объявлениях, которые отличаются только количеством уровней массива, аннотации слева от типа относятся к одному и тому же типу. Например, @C применяется к типу int во всех следующих объявлениях:

@C int f;
@C int[] f;
@C int[][] f;

Кроме того, getParameters() будет работать для извлечения аннотации (й), если способ объявления аннотации позволяет ему ориентироваться как на само объявление параметра, так и на тип. JLS §9.7.4 более подробно объясняет условия, при которых определяется аннотация, предназначенная для типа, объявления или обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...