簡體   English   中英

為什么getAnnotatedParameterTypes沒有看到數組類型的注釋?

[英]Why getAnnotatedParameterTypes does not see annotations for array type?

出於某種原因,我不明白為什么這個代碼打印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));
    }
}

在帶注釋的類型@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更詳細地解釋了確定注釋以確定類型,聲明或兩者的目標的條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM