由于某种原因,我不明白为什么这段代码会显示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));
}
}
答案 0 :(得分:7)
在带注释的类型@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
适用于元素类型{{1} }。有关更多示例,请参见§10.2。此语法的一个重要属性是,在两个仅在数组级别数上不同的声明中,类型左侧的注释引用的是同一类型。例如,在以下所有声明中,
int
适用于类型@C
:int
此外,如果声明的声明方式允许它以参数声明本身以及类型为目标,则@C int f;
@C int[] f;
@C int[][] f;
将可以检索注释。 JLS§9.7.4更详细地说明了确定注释以类型,声明或两者为目标的条件。