Java注解基础概念总结

注解的概念java

注解(Annotation),也叫元数据(Metadata),是Java5的新特性,JDK5引入了Metadata很容易的就可以调用Annotations。注解与类、接口、枚举在同一个层次,并能够应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中,用来对这些元素进行说明注释。swift


注解的语法与定义形式数组

(1)以@interface关键字定义
(2)注解包含成员,成员以无参数的方法的形式被声明。其方法名和返回值定义了该成员的名字和类型。
(3)成员赋值是经过@Annotation(name=value)的形式。
(4)注解须要标明注解的生命周期,注解的修饰目标等信息,这些信息是经过元注解实现。jvm

以 java.lang.annotation 中定义的 Target 注解来讲明:ide

 

@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.ANNOTATION_TYPE } )
public @interface Target {
    ElementType[] value();
}

  

源码分析以下:
第一:元注解@Retention,成员value的值为RetentionPolicy.RUNTIME。
第二:元注解@Target,成员value是个数组,用{}形式赋值,值为ElementType.ANNOTATION_TYPE
第三:成员名称为value,类型为ElementType[]
另外,须要注意一下,若是成员名称是value,在赋值过程当中能够简写。若是成员类型为数组,可是只赋值一个元素,则也能够简写。如上面的简写形式为:函数

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

注解的分类工具

注解的分类有两种分法:源码分析

第一种分法spa

一、基本内置注解,是指Java自带的几个Annotation,如@Override、Deprecated、@SuppressWarnings等;.net

二、元注解(meta-annotation),是指负责注解其余注解的注解,JDK 1.5及之后版本定义了4个标准的元注解类型,以下:

@Target
@Retention
@Documented
@Inherited
三、自定义注解,根据须要能够自定义注解,自定义注解须要用到上面的meta-annotation

第二种分法

注解须要标明注解的生命周期,这些信息是经过元注解 @Retention 实现,注解的值是 enum 类型的 RetentionPolicy,包括如下几种状况:

public enum RetentionPolicy {
    /**
     * 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃.
     * 这意味着:Annotation仅存在于编译器处理期间,编译器处理完以后,该Annotation就没用了
     */
    SOURCE,
 
    /**
     * 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期.
     */
    CLASS,
 
    /**
     * 注解不只被保存到class文件中,jvm加载class文件以后,仍然存在,
     * 保存到class对象中,能够经过反射来获取
     */
    RUNTIME
}
--------------------- 

  

元注解

如上所介绍的Java定义了4个标准的元注解:

@Documented:标记注解,用于描述其它类型的注解应该被做为被标注的程序成员的公共API,所以能够被例如javadoc此类的工具文档化。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

  @Inherited:标记注解,容许子类继承父类的注解

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

@Retention:指Annotation被保留的时间长短,标明注解的生命周期,3种RetentionPolicy取值含义上面以说明

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    RetentionPolicy value();
}

  @Target:标明注解的修饰目标,共有

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}
 
// ElementType取值
public enum ElementType {
    /** 类、接口(包括注解类型)或枚举 */
    TYPE,
    /** field属性,也包括enum常量使用的注解 */
    FIELD,
    /** 方法 */
    METHOD,
    /** 参数 */
    PARAMETER,
    /** 构造函数 */
    CONSTRUCTOR,
    /** 局部变量 */
    LOCAL_VARIABLE,
    /** 注解上使用的元注解 */
    ANNOTATION_TYPE,
    /** 包 */
    PACKAGE
}

参考文章:

反射、注解与依赖注入总结

注解系列知识总结(一)

相关文章
相关标签/搜索