什么是注解
java中的,注解分为两种,元注解和自定义注解,类似于公理和定理的关系。我们常用一些注解:@Autowired
、@Override
等都是自定义注解。
在JAVA中如何实现自定义注解?
@interface关键字
我们想定义一个自己的注解 需要使用 @interface
来定义。
// 元注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {// 注解成员String value() default "Hello World";int number() default 42;boolean isTrue() default true;
}
注解的使用:
public class MyAnnotationTest {@MyAnnotation(value = "测试值")public void exampleMethod(){}/**** @author lyj* @date 2024-11-13*/@Testpublic void testAnnotation() {try {Method method = MyAnnotationTest.class.getMethod("exampleMethod");if(method.isAnnotationPresent(MyAnnotation.class)){MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);System.out.println(annotation.value());System.out.println(annotation.number());System.out.println(annotation.isTrue());}} catch (NoSuchMethodException e) {throw new RuntimeException(e);}}
}
元注解
光加上@interface
关键字还不够,我们需要了解5大元注解
元注解 | 说明 | 使用 | 枚举类 |
---|---|---|---|
@Retention | 指定注解的生命周期 | @Retention(RetentionPolicy.SOURCE) | @Retention(RetentionPolicy.SOURCE) 注解只保留在源文件,当JAVA文件编译成class文件的时候,注解会被遗弃(.java文件)@Retention(RetentionPolicy.CLASS) 注解只保留在class文件,当jvm加载class文件时,被遗弃,这是默认的生命周期@Retention(RetentionPolicy.RUNTIME) 注解不仅被保存在class文件中,jvm加载class之后,仍然存在(内存的字节码中) |
@Target | 指定注解可以修饰的元素类型 | @Target(ElementType.FIELD) | @Target(ElementType.ANNOTATION_TYPE) 标记的注解可应用于注解类型@Target(ElementType.CONSTRUCTOR) 标记的注解可应用于构造函数@Target(ElementType.FIELD) 标记的注解可以用英语字段或属性@Target(ElementType.LOCAL_VARIABLE) 标记的注解可以应用于局部变量@Target(ElementType.METHOD) 标记的注解看应用于方法@Target(ElementType.PACKAGE) 标记的主机可以应用于包声明@Target(ElementType.PARAMETER) 标记的注解可以应用于方法的参数@Target(ElementType.TYPE) 标记的注解可以应用于任何元素 |
@Documented | 指定的注解会被JavaDoc工具提取成文档。默认情况下,JavaDoc是不包括文档的。 | @Documented | |
@Inherited | 表示该注解会被子类继承。注意,仅针对类,成员属性、方法并不收此注释的影响。 | @Inherited | |
@Repeatable | 表示可以重复利用,为了解决同一个注解不能重复在同一类/方法/属性上引用 | @Repeatable |
最常用的元注解还是@Retention
和@Target
。
简单的自定义注解
开始的例子,已经实现了简单的自定义注解。可以通过获取到注解的方法,获取到当前注解的值。
创建注解时,应注意:
- 注解必须由
public
修饰,默认public
; - 一般注解元素以名词命名,若只有一个,建议名称为
value
; - 注解元素类型只能是基本数据类型、基本数据类型数组或注解类型(注意嵌套);
default
指定注解元素默认值时,值类型必须与注解元素类型相同。
使用时应注意
- 若无注解元素,可省略
()
小括号; - 若注解类型为数组,且赋值时只有一个值时,可以省略
{}
花括号; - 如果只有一个注解元素,且注解元素名为
value
。 - 若
ElementType
为PACKAGE
,则此注解用于标注在package-info.java
文件中。(这个文件默认是不创建的。在idea中,双击shift可搜索到,打开是才会创建。)