Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到Java 的。
Java的注解,可以说是一种标识,标识一个类或者一个字段,常常是和反射,AOP结合起来使用。中间件一般会定义注解,如果某些类或字段符合条件,就执行某些能力。
说简单点,就是 定义其他注解的注解。
Java的元注解是用于注解其他注解的注解。它们用于描述注解本身的一些属性,例如它们的元数据。
Java标准库提供了四个元注解:
@Retention (表示在什么级别保存该注解信息) , @Target(表示该注解可以用于什么地方) , @Documented (将此注解包合在iavadoc中) , 和 @Inherited (允许子类继承父类中的注解) 。
一般@Target是被用的最多的。
- 描述了注解的生命周期。
- 有三个可能的值:SOURCE、CLASS、和 RUNTIME。
指定被修饰的注解的生命周期,即注解在源代码、编译时还是运行时保留。它有三个可选的枚举值: SOURCECLASS和RUNTIME。默认为CLASS。
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyRuntimeAnnotation {
//some elements and values
}
- 描述了注解应用的Java元素类型。
- 可以用于类、方法、字段等。
指定被修饰的注解可以应用于的元素类型,如类、方法、字段等。这样可以限制注解的使用范围,避免错误使用。
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyTargetAnnotation {
//some elements and values
}
当一个注解被标记为@Documented,它会被包含在JavaDoc中。
用于指示注解是否会出现在生成的Java文档中。如果一个注解被@Documented元注解修饰,则该注解的信息会出现在API文档中,方便开发者查阅。
import java.lang.annotation.Documented;
@Documented
public @interface MyDocumentedAnnotation {
//some elements and values
}
如果一个注解被标记为@Inherited,那么当一个类被标记为该注解时,它的子类也会继承这个注解。
指示被该注解修饰的注解是否可以被继承。默认情况下,注解不会被继承,即子类不会继承父类的注解。但如果将个注解用@Inherited修饰,那人它就可以被了类继承。
import java.lang.annotation .Inherited;
@Inherited
public @interface MyInheritedAnnotation {
//some elements and values
}
注意:
比如Override这个注解,就不是一个元注解。而是通过元注解定义出来的。
看一个代码,其中包含了多个自定义注解和元注解的使用:
import java.lang.annotation.*;
/**
* @ author 昕宝爸爸
*/
// 定义一个元注解,用于标记其他注解为“高级”
@Target(ElementType.ANNOTATION_TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Advanced {
}
// 定义一个元注解,用于标记其他注解为“实验性”
@Target(ElementType.ANNOTATION_TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Experimental {
}
// 定义一个高级且实验性的注解,用于标记类
@Advanced
@Experimental
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ComplexAnnotation {
String description() default ""; // 描述信息
int version() default 1; // 版本号
}
// 使用ComplexAnnotation注解的类
@ComplexAnnotation(description = "注解的示例", version = 2)
public class ComplexClass {
// ... class body ...
}
在这个例子中,我们定义了两个元注解:@Advanced 和 @Experimental。这两个元注解本身没有实际功能,只是用于标记其他注解。然后,我们定义了一个复杂的注解 @ComplexAnnotation,该注解被标记为 @Advanced 和 @Experimental。最后,我们在一个类 ComplexClass 上使用了 @ComplexAnnotation 注解,并为其提供了描述信息和版本号。这个示例展示了如何创建和使用复杂的自定义注解和元注解。