java注解中数组属性需声明为string[]等形式,使用时必须用{}包裹元素,支持基本类型、class、枚举等,不支持泛型数组和可变参数,未设置时返回空数组而非null。

Java 注解中定义数组类型属性,语法上和普通属性类似,但需显式声明为数组形式(如 String[]、Class>[]),并在使用时按数组方式传参(用花括号包裹多个值或单个值)。
定义含数组属性的注解
在注解接口中,用方括号声明数组类型字段。支持基本类型、引用类型、Class、枚举、其他注解等数组。注意:不能使用泛型数组(如 List<string>[]</string>),也不能省略方括号写成 String...(可变参数不合法)。
示例:
<font size="2"><pre class="brush:php;toolbar:false;">@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiPermissions {
String[] value() default {}; // 字符串数组,默认空
Class>[] services() default {}; // Class 数组
Role[] roles() default {}; // 枚举数组
int[] codes() default {200, 401}; // 基本类型数组,默认含两个值
}
在代码中使用数组属性传参
调用注解时,数组值必须用 {...} 包裹。即使只传一个元素,也需写成 {"read"} 或 {String.class},不可省略花括号。
- 单个字符串:
@ApiPermissions(value = {"admin"}) - 多个字符串:
@ApiPermissions(value = {"user", "admin", "guest"}) - 单个 Class:
@ApiPermissions(services = {UserService.class}) - 混合 Class:
@ApiPermissions(services = {UserService.class, OrderService.class}) - 枚举数组:
@ApiPermissions(roles = {Role.READ, Role.WRITE}) - 省略时走默认值:
@ApiPermissions()→ 等价于@ApiPermissions(value = {})
获取注解中的数组值(运行时反射)
通过反射读取时,直接调用对应方法即可,返回的就是对应类型的数组对象:
<font size="2"><pre class="brush:php;toolbar:false;">Method method = targetMethod;
ApiPermissions ann = method.getAnnotation(ApiPermissions.class);
if (ann != null) {
String[] values = ann.value(); // 返回 String[]
Class>[] services = ann.services(); // 返回 Class[][]
Role[] roles = ann.roles(); // 返回 Role[]
int[] codes = ann.codes(); // 返回 int[]
}
注意:若注解未显式设置某数组属性,且该属性有默认值(如 default {}),则返回空数组而非 null,可安全遍历。
常见错误与避坑提示
-
误写成可变参数:注解中不允许
String... value(),编译报错 -
漏掉花括号:写成
@ApiPermissions(value = "admin")会编译失败,必须是{"admin"} -
混淆默认值写法:默认值必须是编译期常量,
default {"a","b"}合法,default new String[]{"a"}不合法 -
Class 数组写法特殊:不能写
services = UserService.class,必须加花括号:services = {UserService.class}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











