【Java】自定义注解的使用

什么是注解

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
     */
    @Test
    public 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

简单的自定义注解

开始的例子,已经实现了简单的自定义注解。可以通过获取到注解的方法,获取到当前注解的值。

创建注解时,应注意:

  1. 注解必须由public修饰,默认public;
  2. 一般注解元素以名词命名,若只有一个,建议名称为value;
  3. 注解元素类型只能是基本数据类型、基本数据类型数组或注解类型(注意嵌套);
  4. default指定注解元素默认值时,值类型必须与注解元素类型相同。

使用时应注意

  1. 若无注解元素,可省略() 小括号;
  2. 若注解类型为数组,且赋值时只有一个值时,可以省略{}花括号;
  3. 如果只有一个注解元素,且注解元素名为value
  4. ElementTypePACKAGE,则此注解用于标注在package-info.java文件中。(这个文件默认是不创建的。在idea中,双击shift可搜索到,打开是才会创建。)
posted @ 2024-11-13 16:14  陆陆无为而治者  阅读(47)  评论(0编辑  收藏  举报