😀 准备好了吗?让我们一起步入这座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(); // 输出: 这是一个使用了注解的方法。
}
}