【问题标题】:Why getAnnotatedParameterTypes does not see annotations for array type?为什么 getAnnotatedParameterTypes 看不到数组类型的注释?
【发布时间】:2018-06-28 15:40:47
【问题描述】:

出于某种原因,我不明白为什么这段代码会打印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));
    }
}

【问题讨论】:

    标签: java reflection annotations


    【解决方案1】:

    在注解类型@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 适用于元素类型int。如需更多示例,请参阅§10.2

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

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

    此外,getParameters() 将用于检索注解,前提是您的注解声明方式允许它以参数声明本身以及类型为目标。 JLS §9.7.4 更详细地解释了将注释确定为针对类型、声明或两者的条件。

    【讨论】:

    • 哦,没想到这里检查规范,javadocs也没找到明确的答案,谢谢!
    • 我很高兴规范给出了一个清晰的例子,但我发现这种语法相当令人不安。我从中吸取的教训是:计划永远不要对数组类型使用类型注释。
    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多