每日一知识点 - Java 注解

89 阅读3分钟

😀 准备好了吗?让我们一起步入这座Java神奇的城堡,揭开Java注解(Annotations)的神秘面纱,探索其中的奥秘。

📝 每日一知识点

注解

Java注解(Annotations)是一种用于在代码中添加元数据的机制,同 class 和 interface 一样,也属于一种类型。

注解提供了一系列数据用来装饰程序代码(类、方法、字段等),但是注解并不是所装饰代码的一部分,它对代码的运行效果没有直接影响,由编译器决定该执行哪些操作。

1、注解的定义

public @interface MyAnnotation{
     public String value() default "";
}

使用value 为参数名,可以在使用 @MyAnnotation 注解时,既可以@MyAnnotation(value = "xxx"),也可以省略 value=,直接使用@MyAnnotation("xxx")

default 的可以允许直接使用该注解@MyAnnotation,无需指定参数名和值。

2、注解分类

1、内置注解

Java提供了一些常用的内置注解:

  • @Override:用于标识子类方法覆盖父类方法。

  • @Deprecated:用于标识不建议使用的代码元素。

  • @SuppressWarnings:用于抑制编译器警告。

2、元注解

元注解用于注解其他注解:

  • @Retention:指定注解的保留策略。

  • @Target:指定注解可以应用的程序元素。

  • @Documented:指定注解是否包含在Javadoc中。

  • @Inherited:指定注解是否可以被子类继承。

3、注解保留策略和目标

1、注解的保留策略决定了注解在哪个阶段被保留。

@Retention 有三个值:

  • RetentionPolicy.SOURCE:注解只在源码中保留,编译时会被丢弃。

  • RetentionPolicy.CLASS:注解在编译时保留在类文件中,但不会被JVM加载。

  • RetentionPolicy.RUNTIME:注解在运行时保留,可以通过反射机制读取。

2、注解的目标指定了注解可以应用的程序元素。

@Target 包含以下值:

  • ElementType.TYPE:应用于类、接口(包括注解类型)或枚举声明。

  • ElementType.FIELD:应用于字段声明,包括枚举常量。

  • ElementType.METHOD:应用于方法声明。

  • ElementType.PARAMETER:应用于参数声明。

  • ElementType.CONSTRUCTOR:应用于构造方法声明。

  • ElementType.LOCAL_VARIABLE:应用于局部变量声明。

  • ElementType.ANNOTATION_TYPE:应用于注解类型声明。

  • ElementType.PACKAGE:应用于包声明。

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

// 使用元注解定义注解的保留策略和目标
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value();
}

4、注解的使用示例

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.reflect.Method;

// 定义自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {
    String value() default "默认值";
}

// 使用自定义注解的类
class MyClass {
    @MyAnnotation(value = "示例值")
    public void myMethod() {
        System.out.println("这是一个使用了注解的方法。");  // 输出方法信息
    }
}

// 运行时读取注解信息的主类
public class Main {
    public static void main(String[] args) throws Exception {
    //通过反射在运行时读取注解信息。
        // 获取MyClass类的myMethod方法
        Method method = MyClass.class.getMethod("myMethod");
        // 获取方法上的MyAnnotation注解
        MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
        // 如果注解存在,输出注解的值
        if (annotation != null) {
            System.out.println("注解值: " + annotation.value());  // 输出: 注解值: 示例值
        }
        // 调用myMethod方法
        new MyClass().myMethod();  // 输出: 这是一个使用了注解的方法。
    }
}

📎 参考文章

💡 欢迎您在底部评论区留言,一起交流~