欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

注解

程序员文章站 2022-07-10 23:54:02
Annotation,注解,是代码里的特殊标记,可以在编译、类加载、运行时被读取,并执行相应的处理。 注解用于为程序元素(类、方法、成员变量等)设置元数据,相当于一些补充信息,并不影响程序的执行。 注解需要使用特定的工具来处理、执行,访问、处理注解的工具统称为APT。 常见注解: 1、@Overri ......

注解

概念

从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。

作用分类

  1. 编写文档:生成文档(doc文档)
  2. 代码分析:对代码进行分析(使用反射)
  3. 编译检查:让编译器能够实现基本的编译检查(Override)

JDK中预留的一些注解

  1. @Override:检查被标记的方法是否继承自父类(接口)的

    @Override
    public String toString() {
            return super.toString();
    }
  2. @Deprecated:表示已过时

    @Deprecated
    public void show(){
        //有缺陷
    }
    
    public void show1(){
        //替代show()方法
    }
  3. @SuppressWarnings :压制警告(一般传参“all”表示所有)

    @SuppressWarnings("all")
    public void show(){
        //原本可能会有类似never used的警告,添加后就看不到了
    }

自定义注解

格式

元注解
public @interface 注解名{
}

元注解

元注解顾名思义我们可以理解为注解的注解。

它是作用在注解中,方便我们使用注解实现想要的功能。

元注解分别有@Retention、 @Target、 @Documented、 @Inherited和@Repeatable(JDK1.8加入)五种。

  1. @Target

    • Target的英文意思是目标,表示注解的作用范围
    • @Target(ElementType.TYPE) 作用接口、类、枚举、注解
    • @Target(ElementType.FIELD) 作用属性字段、枚举的常量
    • @Target(ElementType.METHOD) 作用方法
    • @Target(ElementType.PARAMETER) 作用方法参数
    • @Target(ElementType.CONSTRUCTOR) 作用构造函数
    • @Target(ElementType.LOCAL_VARIABLE)作用局部变量
    • @Target(ElementType.ANNOTATION_TYPE)作用于注解(@Retention注解中就使用该属性)
    • @Target(ElementType.PACKAGE) 作用于包
    • @Target(ElementType.TYPE_PARAMETER) 作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8加入)
    • @Target(ElementType.TYPE_USE) 类型使用.可以用于标注任意类型除了 class (jdk1.8加入)
    • 一般比较常用的是ElementType.TYPE类型
  2. @Retention

    • Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源码(编译期),字节码(类加载)或者运行期(JVM中运行)。在@Retention注解中使用枚举RetentionPolicy来表示注解保留时期

    • @Retention(RetentionPolicy.SOURCE),注解仅存在于源码中,在class字节码文件中不包含

    • @Retention(RetentionPolicy.CLASS), 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

    • @Retention(RetentionPolicy.RUNTIME), 注解会在class字节码文件中存在,在运行时可以通过反射获取到

    • 如果是自定义注解,如果注解只存着源码中或者字节码文件中就无法发挥作用,而在运行期间能获取到注解才能实现目的,所以自定义注解中肯定是使用 @Retention(RetentionPolicy.RUNTIME)

  3. @Documented

    • Document的英文意思是文档。它的作用是能够将注解中的元素包含到 Javadoc 中去。
  4. @Inherited

    • Inherited的英文意思是继承,但是这个继承和平时理解的继承大同小异,一个被@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。
  5. @Repeatable

    • Repeatable的英文意思是可重复的。顾名思义说明被这个元注解修饰的注解可以同时作用一个对象多次,但是每次作用注解又可以代表不同的含义。

注解的本质

  • 注解的本质就是一个Annotation接口

属性(接口中的抽象方法)

要求

  • 属性的返回值类型只能是以下类型
    • 基本数据类型
    • String
    • 枚举
    • 注解
    • Class类型
    • 以上类型的数组
  • 定义了属性,在使用时,要给属性赋值
    • 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
    • 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno{
    int age();
    int length();
    String name() default "张三";
}


@MyAnno(age=18,length=20)
public class Worker{
    
}

在程序使用(解析)注解

获取注解中的属性值

//1.获取被注解标记的类的字节码文件对象
Class cl = 类名.class;
//2.获取上面的注释对象(其实就是在内存中生成了一个该注解接口的子类实现对象)
注解名 t = cl.getAnnotation(注解名.class);
//3.调用注解对象中定义的抽象方法,获取返回值
Object obj = t.方法名();

本文地址:https://blog.csdn.net/Save_By/article/details/107378208