Java 自定义注解

尘微 2023-02-17 02:26:28 10414 0 0 0

注解是什么?

Java 注解是在 JDK5 时引入的新特性,注解(也被称为 元数据 )为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。

自定义注解时需要用到元注解,那元注解又是什么?

元注解 也是注解(元数据) 他的作用就是负责注解其他注解。
标准的元注解:
+ @Target
+ @Retention
+ @Documented
+ @Inherited

注解@Target

@Target注解,是专门用来限定某个自定义注解能够被应用在哪些Java元素上面的,标明作用范围;取值在java.lang.annotation.ElementType 进行定义的

public enum ElementType {
    /** 类,接口(包括注解类型)或枚举的声明 */
    TYPE,

    /** 属性的声明 */
    FIELD,

    /** 方法的声明 */
    METHOD,

    /** 方法形式参数声明 */
    PARAMETER,

    /** 构造方法的声明 */
    CONSTRUCTOR,

    /** 局部变量声明 */
    LOCAL_VARIABLE,

    /** 注解类型声明 */
    ANNOTATION_TYPE,

    /** 包的声明 */
    PACKAGE
}

@Retention元注解:

@Retention注解,翻译为持久力、保持力。即用来修饰自定义注解的生命周期。

注解的生命周期有三个阶段:
1.Java源文件阶段;
2.编译到class文件阶段;
3.运行期阶段;
①、如果被定义为 RetentionPolicy.SOURCE,则它将被限定在Java源文件中,那么这个注解即不会参与编译也不会在运行期起任何作用,这个注解就和一个注释是一样的效果,只能被阅读Java文件的人看到;

②、如果被定义为 RetentionPolicy.CLASS,则它将被编译到Class文件中,那么编译器可以在编译时根据注解做一些处理动作,但是运行时JVM(Java虚拟机)会忽略它,并且在运行期也不能读取到;

③、如果被定义为 RetentionPolicy.RUNTIME,那么这个注解可以在运行期的加载阶段被加载到Class对象中。那么在程序运行阶段,可以通过反射得到这个注解,并通过判断是否有这个注解或这个注解中属性的值,从而执行不同的程序代码段。

注意:实际开发中的自定义注解几乎都是使用的 RetentionPolicy.RUNTIME 。

@Documented元注解:

@Documented注解,是被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中。。

JavaDoc:
**Javadoc是什么 官方回答: Javadoc is a tool for generating API documentation in HTML format from doc comments in source code. 译:Javadoc是一款能根据源代码中的文档注释来产生HTML格式的API文档的工具。**

@Inherited元注解:

@Inherited注解,是指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。

@Inherited注解只对那些@Target被定义为 ElementType.TYPE 的自定义注解起作用。

自定义注解

package com.spring;

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

/**
 * @Description
 * @Author wugongzi
 * @Date 2022/7/8 22:04
 */
// 生命周期:运行期
@Retention(RetentionPolicy.RUNTIME)
// 注解可以使用在类和方法上
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface TestAnnotation {
    String value() default "";
}