浅谈注解(个人理解,如有疏漏欢迎大家补充)

定义:

  注解历史:jdk5的新特性,在5之前一般都是用xml搭配反射机制,但这样搭配程序会很分散,由此注解诞生,完美体现出高内聚低耦合的特性,代码可读性更强。

  什么是注解(annotation):它是一个存储元数据的一个接口,可以通过反射机制来获取到指定程序元素的annotation对象(注解对象就是注解起作用的地方),然后通过注解对象来获取注解里的元数据。

               注解并不会影响一个程序的执行或它本身的状态

    元数据(metadata):数据的数据,作用(用来约束数据的整体结构),如果元数据不好理解可以联想一下元注解,比如@Target({ElementType.METHOD,ElementType.TYPE}),这个元注解作用是规范了注解作用地方,此例规范注解作用在类和方法上,元数据那么就好理解了,它本质就是在定义/规范/约束数据的一个数据;

    理解了元数据,那么注解就好理解了,(一个存储元数据的接口);

    元数据几种常见作用:

      ①生成文档:这是最常见的,也是java 最早提供的注解。常用的有@param @return 等;

      ② 跟踪代码依赖性,实现替代配置文件功能。常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。;

      ③在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

 jdk5定义的元注解

    @Retention(生命周期):通过它定义了一个注解 的生命周期

                1.SOURCE:在源文件中有效(即源文件保留),比如:@override什么周期就是source,检测子类中方法是否与父类方法对应,当子类用@override重写的方法父类没有就会报错

                2.CLASS:在class文件中有效(即class保留)
                3.RUNTIME:在运行时有效(即运行时保留)

    @Target:定义了注解作用地方

         1.CONSTRUCTOR:用于描述构造器
         2.FIELD:用于描述域
         3.LOCAL_VARIABLE:用于描述局部变量
         4.METHOD:用于描述方法
         5.PACKAGE:用于描述包
         6.PARAMETER:用于描述参数
         7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

  

    @Inherited:

        @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

   @Documented:

        @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

相关注解的解释可参考:https://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

原文地址:https://www.cnblogs.com/CL-King/p/13863169.html