重复注解与类型注解
# 重复注解与类型注解详解
前言
在 Java 8 之前,注解的使用有一些局限性,比如:一个元素上只能应用一次注解,不支持在类型上直接应用注解。Java 8 针对这些问题进行了改进,引入了可重复的注解和类型注解,从而增强了注解的灵活性和可用性。
# 1. 可重复的注解
背景:
在 Java 8 之前,一个元素上同一个注解只能使用一次,这限制了开发者的灵活性。Java 8 引入了可重复注解的概念,允许在同一个元素上重复使用同一个注解。
实现方式:
实现可重复注解需要两个步骤:
- 创建一个容器注解,用于存放多个重复的注解。
- 在可重复的注解上使用
@Repeatable
指定容器注解。
代码示例:
- 创建容器注解:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
// 定义一个容器注解,用于存放多个 MyAnnotation
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {
MyAnnotation[] value(); // 数组形式存放多个 MyAnnotation
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
- 创建可重复的注解:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
// 定义可重复的注解,并使用 @Repeatable 指定其容器注解
@Repeatable(MyAnnotations.class)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value(); // 注解的属性
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
- 测试使用可重复注解:
public class TestAnnotations {
// 在方法上使用两个 MyAnnotation 注解
@MyAnnotation("Hello")
@MyAnnotation("World")
public void show() {
}
public static void main(String[] args) {
// 反射获取方法上的注解
MyAnnotation[] annotations = TestAnnotations.class.getMethod("show").getAnnotationsByType(MyAnnotation.class);
for (MyAnnotation annotation : annotations) {
System.out.println(annotation.value()); // 输出:Hello 和 World
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
开发场景:
可重复注解在实际开发中非常适用于需要标记多个相同类型信息的场景。例如,定义多个相似的安全权限控制注解、API 的版本信息等。
# 2. 类型注解
背景:
在 Java 8 之前,注解只能应用在声明的上下文中,如类、方法、字段、参数等。而 Java 8 扩展了注解的使用场景,允许注解用于任何类型的位置,包括泛型、强制类型转换、实现接口、抛出异常等。
实现方式:
类型注解可以应用在类型参数、局部变量、方法返回值等位置,不需要额外的配置。
代码示例:
public class TestTypeAnnotations {
// 使用类型注解在泛型类型上
private List<@MyAnnotation("NonNull") String> list = new ArrayList<>();
// 使用类型注解在强制类型转换上
public void castExample(Object obj) {
String str = (@MyAnnotation("NonNull") String) obj;
System.out.println(str);
}
// 使用类型注解在方法参数上
public void show(@MyAnnotation("NotNull") String str) {
System.out.println(str);
}
public static void main(String[] args) {
TestTypeAnnotations test = new TestTypeAnnotations();
test.castExample("Hello, Type Annotations!");
test.show("Hello, Parameter Annotations!");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
开发场景:
类型注解在实际开发中可以用于更严格的类型检查和代码分析。例如,在泛型类型上使用注解表示类型的非空约束,在类型转换时提供额外的校验信息,甚至在工具中可以结合这些类型注解进行编译期或运行期的检查。
总结
Java 8 通过引入可重复注解和类型注解,极大地扩展了注解的应用场景和灵活性。可重复注解简化了多次使用同类注解的场景,而类型注解则为类型的描述和检查提供了更多的可能性。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08