为什么getAnnotatedParameterTypes看不到数组类型的注释?

时间:2018-06-28 15:40:47

标签: java reflection annotations

由于某种原因,我不明白为什么这段代码会显示truefalse,关于数组的特殊之处在于它在此处未包含该注释?

如果您改用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 :(得分:7)

在带注释的类型@Lel String[]中,注释适用于元素类型String。要注释数组类型,可以使用String @Lel []

JLS在§9.7.4中包含类似的示例:

  

类型注释可以应用于数组类型或其任何组件类型(§10.1)。例如,假设ABC是用@Target(ElementType.TYPE_USE)进行元注释的注释类型,则给出字段声明:

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

@A适用于数组类型int[][]@B适用于其组件类型int[]@C适用于元素类型{{1} }。有关更多示例,请参见§10.2

     

此语法的一个重要属性是,在两个仅在数组级别数上不同的声明中,类型左侧的注释引用的是同一类型。例如,在以下所有声明中,int适用于类型@C

int

此外,如果声明的声明方式允许它以参数声明本身以及类型为目标,则@C int f; @C int[] f; @C int[][] f;将可以检索注释。 JLS§9.7.4更详细地说明了确定注释以类型,声明或两者为目标的条件。