美文网首页
注解的基础

注解的基础

作者: 冰鑫925 | 来源:发表于2017-06-02 16:18 被阅读27次

    注解
    java注解用来描述java代码中的元信息,通常情况下,注解不会影响代码执行,尽管有些情况下,注解可以做到影响代码的执行。Java中的类、方法、变量、参数、包都可以被注解。元数据是描述数据的数据,注解不是必须的,但了解注解有助于我们深入理解某些第三方框架(比如Android Support Annotations、JUnit、xUtils、ActiveAndroid等),提高工作效率。

    注解的作用
    格式检查:告诉编译器信息,比如被@Override标记的方法如果不是父类的某个方法,IDE会报错;
    减少配置:运行时动态处理,得到注解信息,实现代替配置文件的功能;
    减少重复工作:比如第三方框架xUtils,通过注解@ViewInject减少对findViewById的调用,类似的还有(JUnit、ActiveAndroid等);

    java内置了三种编译指令,编译指令,构建指令,运行指令,注解可以应用于构建时,当你在构建项目时,构建过程中会产生源代码,编译源代码,xml文件,将编译过的代码或文件打包进jar文件等等。软件的的构建通常使用Apache Ant 或者 Apache Maven这样的工具自动完成。构建工具会扫描java代码里的注解,然后根据这些注解产生源代码或者其他的文件。一般情况 下注解不会出现在编译后的java文件中,但是java支持运行时注解,这些注解可以通过Java反射访问。
    注意:运行时注解主要是提供给程序或者第三方API一些指令。

    元注解:
      元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
        1.@Target,
        2.@Retention,
        3.@Documented,
        4.@Inherited
     @Target:

    @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
      作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
      取值(ElementType)有:
        1.CONSTRUCTOR:用于描述构造器
        2.FIELD:实例
        3.LOCAL_VARIABLE:用于描述局部变量
        4.METHOD:用于描述方法
        5.PACKAGE:用于描述包
        6.PARAMETER:用于描述参数
        7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
    @Retention:

    @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

    作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
    取值(RetentionPoicy)有:
        1.SOURCE:在源文件中有效(即源文件保留)
        2.CLASS:在class文件中有效(即class保留)
        3.RUNTIME:在运行时有效(即运行时保留)
    @Documented:
    @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

    @Inherited:
    @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
    注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
    当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

    @Deprecated
    可以用来标记类、方法、属性
    如果上述三种元素不再使用可以用@Deprecated标记
    如果代码使用了@Deprecated注解的类,方法,或者属性,编译器会给出警告。
    @Deprecated注解使用很简单,以下是使用@Deprecated注解一个已经弃用的类。

    @Override
    @Override注解用来标示重写父类中的方法,如果这个方法没有重写父类的方法,而添加这个注解,编译器会报错。实际上,在子类中重写父类或者接口中的方法,@Override并不是必须的。但是,仍然建议你使用这个注解。假设你修改了父类的方法的名字,那么之前重写的子类方法将不再属于重写,如果没有@Overide,你将不会察觉到这个子类的方法。有了这个注解修饰,编译器则会提示你这些信息。

    @Suppress Warnings
    @Suppress Warning用来抑制编译生成警告信息
    可以修饰的元素为类,方法,方法参数,属性,局部变量
    当一个方法调用了一个被弃用的方法或者是不安全的类型转换,编译器就会产生警告,你可以使用@Suppress Warnings抑制编译器产生警告。

    自定义注解:

    使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

    自定义注解格式:
    public @interface 注解名 {定义体} 注解参数的可支持数据类型:
        1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
        2.String类型
        3.Class类型
        4.enum类型
        5.Annotation类型
        6.以上所有类型的数组

    Paste_Image.png

    相关文章

      网友评论

          本文标题:注解的基础

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