Java  Annotation是JDK5.0引入的一种注释机制。它与注释有一定区别,可以理解为代码上的特殊标记,通过这些标记我们可以在编译,类加载,运行等程序类的生命周期内被读取、执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。

一、Annotation架构图

我们可以这样理解这张图:

  (1)Annotation是个接口,它有RetentionPolicy和ElementType属性

  (2)一个Annotation接口和一个RetentionPolicy相关联,和1~n个ElementType相关联

  (3)右半边的Override、Target等都是java中自带的Annotation的实现类

二、RetentionPolicy和ElementType

  RetentionPolicy和ElementType是Annotation重要的组成部分。

  1、RetentionPolicy是Enum枚举类型,它用来指定Annotation的策略。通俗点说,就是不同RetentionPolicy类型的Annotation的作用域不同。
        “每1个Annotation” 都与 “1个RetentionPolicy”关联。
         a) 若RetentionPolicy的类型为 SOURCE,则意味着:Annotation仅存在于编译器处理期间,编译器处理完之后,该Annotation就没用了。
             例如,“ @Override ”标志就是一个策略为SOURCE的Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,“@Override”就没有任何作用了。
         b) 若RetentionPolicy的类型为 CLASS,则意味着:编译器将Annotation存储于类对应的.class文件中,它是Annotation的默认行为。
         c) 若RetentionPolicy的类型为 RUNTIME,则意味着:编译器将Annotation存储于class文件中,并且可由JVM读入。

  2、 ElementType 是Enum枚举类型,它用来指定Annotation的类型。
        “每1个Annotation” 都与 “1~n个ElementType”关联。当Annotation与某个ElementType关联时,就意味着:Annotation有了某种用途。
        例如,若一个Annotation对象是METHOD类型,则该Annotation只能用来修饰方法。

三、定义Annotation

  Annotation的通用定义:

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

  这段代码定义了一个Annotation,它的名字是MyFirstAnnotation。定义之后,我们就可以在代码中使用“@MyFirstAnnotation”来调用它。

  而其它的@Documented, @Target, @Retention, @interface都是来修饰MyFirstAnnotation的。它们的含义如下:

  (1) @interface
         使用@interface定义注解时,意味着它实现了java.lang.annotation.Annotation接口,即该注解就是一个Annotation。
         定义Annotation时,@interface是必须的。
         注意:它和我们通常的implemented实现接口的方法不同。Annotation接口的实现细节都由编译器完成。通过@interface定义注解后,该注解不能继承其他的注解或接口。

  (2)@Documented

    类和方法的Annotation在缺省情况下是不出现在javadoc中的。如果使用@Documented修饰该Annotation,则表示它可以出现在javadoc中。

    定义Annotation时,@Documented可有可无;若没有定义,则Annotation不会出现在javadoc中。

  (3)@Target(ElementType.TYPE)

    前面我们说过,ElementType 是Annotation的类型属性。而@Target的作用,就是来指定Annotation的类型属性。
        @Target(ElementType.TYPE) 的意思就是指定该Annotation的类型是ElementType.TYPE。这就意味着,MyFirstAnnotation是来修饰“类、接口(包括注释类型)或枚举声明”的注解。
        定义Annotation时,@Target可有可无。若有@Target,则该Annotation只能用于它所指定的地方;若没有@Target,则该Annotation可以用于任何地方。.

  (4)@Retention(RetentionPolicy.RUNTIME)

    前面我们说过,RetentionPolicy 是Annotation的策略属性,而@Retention的作用,就是指定Annotation的策略属性。
     @Retention(RetentionPolicy.RUNTIME) 的意思就是指定该Annotation的策略是RetentionPolicy.RUNTIME。这就意味着,编译器会将该Annotation信息保留在.class文件中,并且能被虚拟机读取。
          定义Annotation时,@Retention可有可无。若没有@Retention,则默认是RetentionPolicy.CLASS。

四、Java自带的Annotation

  也就是Annotation架构图中的右半边:

  

  由于“@Deprecated和@Override”类似,“@Documented, @Retention, @Target”在上文已经做过解释;下面,我们对@Deprecated, @Inherited, @SuppressWarnings 这3个Annotation进行说明。

  1、@Deprecated,定义如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}

  说明:

    (1) @interface -- 它的用来修饰Deprecated,意味着Deprecated实现了java.lang.annotation.Annotation接口;即Deprecated就是一个注解。
    (2) @Documented -- 它的作用是说明该注解能出现在javadoc中。
    (3) @Retention(RetentionPolicy.RUNTIME) -- 它的作用是指定Deprecated的策略是RetentionPolicy.RUNTIME。这就意味着,编译器会将Deprecated的信息保留在.class文件中,并且能被虚拟机读取。
    (4) @Deprecated 所标注内容,不再被建议使用。
           例如,若某个方法被 @Deprecated 标注,则该方法不再被建议使用。如果有开发人员试图使用或重写被@Deprecated标示的方法,编译器会给相应的提示信息。

  2、@Inherited,定义如下:

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

  说明:

    (1) @interface -- 它的用来修饰Inherited,意味着Inherited实现了java.lang.annotation.Annotation接口;即Inherited就是一个注解。
    (2) @Documented -- 它的作用是说明该注解能出现在javadoc中。
    (3) @Retention(RetentionPolicy.RUNTIME) -- 它的作用是指定Inherited的策略是RetentionPolicy.RUNTIME。这就意味着,编译器会将Inherited的信息保留在.class文件中,并且能被虚拟机读取。
    (4) @Target(ElementType.ANNOTATION_TYPE) -- 它的作用是指定Inherited的类型是ANNOTATION_TYPE。这就意味着,@Inherited只能被用来标注“Annotation类型”。
    (5) @Inherited 的含义是,它所标注的Annotation将具有继承性。
         假设,我们定义了某个Annotaion,它的名称是MyAnnotation,并且MyAnnotation被标注为@Inherited。现在,某个类Base使用了MyAnnotation,则Base具有了“具有了注解MyAnnotation”;现在,Sub继承了Base,由于MyAnnotation是@Inherited的(具有继承性),所以,Sub也“具有了注解MyAnnotation”。

  3、@SuppressWarnings,定义如下:

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings { String[] value(); }

  说明:

    (01) @interface -- 它的用来修饰SuppressWarnings,意味着SuppressWarnings实现了java.lang.annotation.Annotation接口;即SuppressWarnings就是一个注解。
    (02) @Retention(RetentionPolicy.SOURCE) -- 它的作用是指定SuppressWarnings的策略是RetentionPolicy.SOURCE。这就意味着,SuppressWarnings信息仅存在于编译器处理期间,编译器处理完之后SuppressWarnings就没有作用了。
    (03) @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) -- 它的作用是指定SuppressWarnings的类型同时包括TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE。
           TYPE意味着,它能标注“类、接口(包括注释类型)或枚举声明”。
           FIELD意味着,它能标注“字段声明”。
           METHOD意味着,它能标注“方法”。
           PARAMETER意味着,它能标注“参数”。
           CONSTRUCTOR意味着,它能标注“构造方法”。
           LOCAL_VARIABLE意味着,它能标注“局部变量”。
    (04) String[] value(); 意味着,SuppressWarnings能指定参数
    (05) SuppressWarnings 的作用是,让编译器对“它所标注的内容”的某些警告保持静默。例如,"@SuppressWarnings(value={"deprecation", "unchecked"})" 表示对“它所标注的内容”中的 “SuppressWarnings不再建议使用警告”和“未检查的转换时的警告”保持沉默。

  

Java Annotation使用详解的更多相关文章

  1. Java反序列化漏洞详解

      Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具.本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进 ...

  2. java异常处理机制详解

    java异常处理机制详解 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足.为了解决这些异常,我们需要知道异常发生的原因.对于一些常见的异常,我 ...

  3. Java web Cookie详解(持久化+原理详解+共享问题+设置中文+发送多个Cookie)

    Java web Cookie详解 啥是cookie? 查询有道词典得: web和饼干有啥关系? 这个谜底等等来为大家揭晓 会话技术 web中的会话技术类似于生活中两个人聊天,不过web中的会话指的是 ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  6. Java String类详解

    Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...

  7. 最新java数组的详解

    java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...

  8. JAVA IO 类库详解

    JAVA IO类库详解 一.InputStream类 1.表示字节输入流的所有类的超类,是一个抽象类. 2.类的方法 方法 参数 功能详述 InputStream 构造方法 available 如果用 ...

  9. 转:Java HashMap实现详解

    Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述:    HashMap是基于哈希表的M ...

随机推荐

  1. 主元素问题(Java)

    x称为一个长度为n的数组的a的主元素,如果这个数组里面等于x的元素的数目不少于n/2个. 例如,a={2,3,2,2,5,3,2,4,2},x=2就是这个主元素.给定包含n个元素的数组a,主元素问题就 ...

  2. jmeter响应结果乱码问题

    问题分析 当响应数据或响应页面没有设置编码时,jmeter会按照jmeter.properties文件中,sampleresult.default.encoding设置的格式解析 默认ISO-8859 ...

  3. .Net Core中依赖注入服务使用总结

    一.依赖注入 引入依赖注入的目的是为了解耦和.说白了就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用.这样做的好处就是如果添加了另一个种实现类,不需要修改之前代码,只需要修改注入的地方将 ...

  4. C++基础之多态性和动态联编

    (1)多态性是指相同的函数名对应不同的实现.多态性采用两种方式:重载方式和覆盖方式.重载方式表现在函数重载和运算符重载:覆盖方式表现在基类与派生类中相同说明的函数.(2)函数重载要求被重载的函数应该在 ...

  5. centos lamp 配置

    # 1. 查看是否有httpd进程正在运行(下图是有的情况) ps -ef|grep httpd

  6. App裂变活动多种玩法解析

    移动互联网时代,流量为王.在App获取流量的过程中,有资金的砸广告,没资金的铺渠道,但是不管你有钱没钱,社交平台都是必须重点争夺的流量阵地. 毕竟,截至2018年底,微信及WeChat的合并月活跃账户 ...

  7. 测试之美 Part 1

    1. 本人曾经在一次电话面试中被问到,为什么你作为一个测试人员,还要别人来告诉你要在哪些平台上去测试,你完全可以自己去定夺.下面的这段话是来自<测试之美>,我觉得很有逻辑的反驳了那位面试官 ...

  8. sql 查找重复数据,并且重复数据有子集

    SELECT A.* FROM comm_department A INNER JOIN ( select path,count(*) as count from comm_department gr ...

  9. day02笔记

    1.linux环境配置阿里云yum源 linux软件包管理之 yum工具(如同pip3工具) pip3是管理python模块的工具,自动解决模块依赖,降低开发人员心智负担 pip3 install f ...

  10. rsyslog服务器同步其他服务器上面应用日志(如mysql审计日志 、nginx日志)

    **环境说明**系统:ubuntu 14.04 (CentOS可以参考http://www.cnblogs.com/hanyifeng/p/5463338.html) rsyslog版本 :8.16. ...