Java 注解介绍

前言

Java注解介绍javascript

1. 注解中最重要的三个类

AnnotationElementTypeRetentionPolicy这三个类是注解中最重要的类,没有这三个类就没有注解,其中Annotation是接口,其他两个是枚举。
全部的注解都基于这三个类,所谓的元注解也是用这三个类生成的,只不过可修饰的元素(ElementType)为ANNOTATION_TYPE罢了,你也能够写个元注解。html

1. Annotationjava

package java.lang.annotation; //java.lang.annotation包下
public interface Annotation {
    boolean equals(Object var1);

    int hashCode();

    String toString();

    Class<? extends Annotation> annotationType();
}复制代码

2. ElementTypeapi

package java.lang.annotation; //java.lang.annotation包下
public enum ElementType {
    TYPE,  // 类、接口(包括注释类型)或枚举声明
    FIELD,  // 字段声明(包括枚举常量)
    METHOD,  //方法声明
    PARAMETER,  //参数声明
    CONSTRUCTOR,  //构造方法声明
    LOCAL_VARIABLE,  //局部变量声明
    ANNOTATION_TYPE,  //注解类型声明
    PACKAGE,  //包声明
    TYPE_PARAMETER,  //类型参数声明(1.8新加入),表示这个注解能够用来标注类型参数
    TYPE_USE; //类型使用声明(1.8新加入),用于标注各类类型,只要是类型名称,均可以进行注解

    private ElementType() {
    }
}复制代码

3. RetentionPolicy数组

package java.lang.annotation;//java.lang.annotation包下
public enum RetentionPolicy {
    SOURCE,  //注解将被编译器丢弃;Annotation信息仅存在于编译器处理期间,编译器处理完以后就没有该Annotation信息了
    CLASS,  //注解在class文件中可用,但会被VM丢弃
    RUNTIME;  //VM将在运行期也保留注解信息,所以能够经过反射机制读取注解的信息

    private RetentionPolicy() {
    }
}复制代码

2. 四种元注解

Java提供了四种元注解(meta-annotation),元注解就是专职负责注解其余的注解,因此这四种注解的Target值都是ElementType.ANNOTATION_TYPE框架

1. @Target
表示该注解能够用在什么地方,由ElementType枚举定义ide

@Documented
@Retention(RetentionPolicy.RUNTIME) //被VM识别
@Target({ElementType.ANNOTATION_TYPE}) //修饰注解类型
public @interface Target {
    ElementType[] value(); //当使用此注解时,无默认注解,必需要传入ElementType
}复制代码

2. @Retention
表示须要在什么级别保存该注解信息,由RetentionPolicy枚举定义学习

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Retention {
    RetentionPolicy value(); // 必需要传入
}复制代码

3. @Documented
表示注解会被包含在javaapi文档中ui

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Documented {
}复制代码

4. @Inherited
容许子类继承父类的注解,即它所标注的Annotation将具备继承性spa

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Inherited {
}复制代码

3. 注解的基本语法

//@Target(ElementType.Method) 
  //@Retention(RetentionPolicy.RUNTIME)
  public @interface MyAnnotation {
     int id(); // default 1; 不添加default值使用该注解时必需要传入传入
     String value() default ""; //若是只有value()这一个属性须要赋值的话,能够省略键值对传值
     // Integer id() default 1; //抛出异常,Invalid type
  }复制代码
  1. @interface表示该类是一个注解,并实现了Annotation接口

  2. @Target表示该注解能够修饰的类型;若是不填,则此注解可使用任何元素之上;

  3. @Retention用来定义注解在哪个级别可用,是源码中可见、编译器可见仍是VM可见;若是不填,默认级别是CLASS。

  4. 注解元素可用的类型
    全部基本类型(int,float,boolean,byte,double,char,long,short)、 String、Class、enum、Annotation和以上类型的数组;其它的值都会抛出Error: 注释值不是容许的类型

  5. 注解的快捷方式
    当注解内元素方法名为value()时,而且该元素是惟一一个须要赋值的值(另外的值有默认值),能够不用使用键值对来传值,直接使用@MyAnnotation("2")传值;若是有两个,则要使用@MyAnnotation(id=1,value = "2")来传值。

其中根据注解参数的个数,咱们能够将注解分为:标记注解、单值注解、完整注解三类。

4. Java经常使用的注解

1. @Deprecated
标记注解,所标注内容,再也不被建议使用。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.LOCAL_VARIABLE, ElementType.METHOD, ElementType.PACKAGE, ElementType.PARAMETER, ElementType.TYPE})
public @interface Deprecated {
}复制代码

2. @Override
标记注解,只能标注方法,表示该方法覆盖父类中的方法。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}复制代码

3. @SuppressWarnings
所标注内容产生的警告,编译器会对这些警告保持静默。

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}
/* value可取的值: deprecation -- 使用了不同意使用的类或方法时的警告 unchecked -- 执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。 fallthrough -- 当 Switch 程序块直接通往下一种状况而没有 Break 时的警告。 path -- 在类路径、源文件路径等中有不存在的路径时的警告。 serial -- 当在可序列化的类上缺乏 serialVersionUID 定义时的警告。 finally -- 任何 finally 子句不能正常完成时的警告。 all -- 关于以上全部状况的警告。 */复制代码

5. 处理注解

Java处理注解有两种方式:

  1. 使用apt来在编译时期生成相应的代码,经过注解处理器(AnnotationProcessor)来处理

  2. 在运行时经过反射获取注解信息来处理

这块以后专门来学习,这篇文章不赘述了。

6. 注解的做用

  1. 生成文档。这是最多见的,也是java 最先提供的注解。经常使用的有@see @param @return 等

  2. 代码分析,跟踪代码依赖性。如JUnit框架的注解使用。

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

结语

本篇文章介绍注解的基本概念和做用,对注解的基本有个清晰的了解,以后再单独写对注解的处理,ButterKnife是个很好的学习例子。



参考:
Java Annotation认知(包括框架图、详细介绍、示例说明)
Java注解全面解析
Java深度历险(六)——Java注解

相关文章
相关标签/搜索