美文网首页
Annotation

Annotation

作者: 第一号伤心人 | 来源:发表于2018-03-20 13:56 被阅读1次

    Annotation的介绍

        一种对源代码进行说明的元数据。应用于包、接口、类、字段、构造器、方法参数、局部变量的特殊修饰符,用来描述元数据的一种工具,主要作用:

        1、生成文档:通过代码中标识的元数据生成javadoc文档

        2、编译检查:通过代码中标识的元数据让编译器在编译期间进行检查验证

        3、编译时动态处理:编译时通过代码中标识的元数据动态处理,如动态生成代码

        4、运行时动态处理:编译时通过代码中标识的元数据动态处理,如反射注入实例

        注解主要分为三类:

        1、Java 自带的标准注解

            包括@Override、@Deprecated和@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。

        2、元注解

            定义注解的注解。四种元注解主要包括

            1、@Retention:标识注解被保留的阶段(生命周期)

                RetentionPolicy.SOURCE — 只在源码显示、在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。

                RetentionPolicy.CLASS — 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。

                RetentionPolicy.RUNTIME — 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

            2、@Target:标识注解的使用范围(作用域)

                ElementType.TYPE:用于描述类、接口或enum声明

                ElementType.FIELD:用于描述实例变量

                ElementType.METHOD:方法声明

                ElementType.PARAMETER:参数声明

                ElementType.CONSTRUCTOR:构造方法声明

                ElementType.LOCAL_VARIABLE:局部变量声明

                ElementType.ANNOTATION_TYPE:

                ElementType.PACKAGE:用于记录java文件的package信息

            3、@Inherited:标识注解可继承

            4、Documened:标识注解是否生成javadoc文档

        3、自定义注解

            根据自己的需求定义注解,并可用注解对自定义注解进行注解。

    使用注解:

        @<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,...)

    解析注解:

         通过反射获取类 、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

    注解的原理

    从java源码到class字节码是由编译器完成的,编译器会对java源码进行解析并生成class文件,而注解也是在编译时由编译器进行处理,编译器会对注解符号处理并附加到class结构中。根据jvm规范,class文件结构是严格有序的格式,唯一可以附加信息到class结构中的方式就是保存到class结构的attributes属性中。我们知道对于类、字段、方法,在class结构中都有自己特定的表结构,而且各自都有自己的属性,而对于注解,作用的范围也可以不同,可以作用在类上,也可以作用在字段或方法上,这时编译器会对应将注解信息存放到类、字段、方法自己的属性上。               

    相关文章

      网友评论

          本文标题:Annotation

          本文链接:https://www.haomeiwen.com/subject/jihwfftx.html