zoukankan      html  css  js  c++  java
  • JAVA 中的标准注解

    其中四个是元注解(红色部分),用于描述注解接口的行为属性,其他的是规则接口,可以用来注解你的源代码中的项。

    注 解 接 口 应 用 场 景 目 的
    Deprecated 全部 将项标记为过时的
    SuppressWarnings 除了包和注解之外的所有情况 阻止某个给定类型的警告信息
    Override 方法 检查该方法是否覆盖了某一个超类方法
    PostConstruct 方法 被标记的方法应该在构造之后立即被调用
    PreDestroy 被标记的方法应该在移除之前立即被调用
    Resource 类、接口、方法、域

    在类或者接口上:标记为在其他地方要用到的资源

    在方法或者域上 :为 “注入”  而标记

    Resources 类、接口 一个资源组
    Grenerated 全部  
    Target 注解 指明可以应用这个注解的那些项
    Retention 注解 指明这个注解可以保留多久
    Documented 注解 指明这个注解应该包含在注解项的文档中
    Inherited 注解 指明当这个注解应用于一个类的时候,能够在被他的子类继承

    看到这里,你可能会有很多的疑惑,不要急,继续往下看!!!

    参考:http://www.cnblogs.com/skywang12345/p/3344137.html

       http://www.cnblogs.com/taoxiaoji/archive/2011/01/19/1939651.html

          http://blog.csdn.net/tigerdsh/article/details/8848890

       http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html

    首先知道注解是什么,能干什么,在什么时候用?

    1.是什么注解?

      即一种对数据的描述。为我们在代码中 添加信息 提供了一种 形式化 的 方法,是我们可以在 稍后 某个时刻 方便地使用这些数据(java虚拟机 通过 解析注解 来使用这些数据)。即它是一种对数据的描述。

    2.注解能干什么?

    • 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等
    • 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。
    • 在编译时进行格式检查。如 @override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

       它也是一种注释,不过它不只有注释的意义。可能你会觉得有点抽象。我们还是使用 @override 举例,如果它标记了某个方法不是重写了它的父类的方法,那么在编译时就会报错。这不就是对方法(你可以理解方法也是一种数据)描述吗?这种描述相当于某种限定,超出限定会抛出相应的异常,可以更加快捷、方便的编码,减少代码量。

    3.怎么用注解?

      3.1 注解的定义:使用 @interface

      modifiers @interface AnnotationName
      {
        element declaration1;
        element declaration2;
      }
    

        modifiers : private、public、protect、default

        AnnotationName:自定义注解的名称,类似于类名。

        element:注解元素的类型

        declaration1declaration2:注解元素的名称

      3.2 注解中元素的 声明 和 定义  

        注解参数的可支持数据类型:

          1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
          2.String类型
          3.Class类型
          4.enum类型
          5.Annotation类型
          6.以上所有类型的数组

       1. type elementName();
       
       2. type elementName() default value;
    

      看到这里,你已经知道如何自定义注解了吧。

      在创建自定义注解之前,我们先看看java中的 java.lang.annotation 包的类组成:

      

      1)Annotation:所有的注解 都继承 Annotation 接口,就相当于 Java 中的所有类,都是继承与 Object 类。

      2)AnnotationFormatError、AnnotationTypeMismatchException、IncompleteAnnotationException:这3个类都是 自定义异常

      3)ElementType、RetentionPolicy:两个枚举类型。

        ElementType:用于描述注解的使用范围,限定注解标记的对象,总共有 8 种。

    public enum ElementType {
        //此值对应修饰:类,接口(包括注解类型),枚举类型
        TYPE,
    
        //此值对应修饰:属性(包括枚举常量)
        FIELD,
    
        //此值对应修饰:方法
        METHOD,
    
        //此值对应修饰:方法中的参数
        PARAMETER,
    
        //此值对应修饰:构造方法
        CONSTRUCTOR,
    
        //此值对应修饰:局部变量
        LOCAL_VARIABLE,
    
        //此值对应修饰:注解
        ANNOTATION_TYPE,
    
        //此值对应修饰:包
        PACKAGE
    }

        RetentionPolicy:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

    public enum RetentionPolicy {
         //注解将被编译器丢弃 
        SOURCE,
    
        //注解在class文件中可用,但会被VM(虚拟机)丢弃 
        CLASS,
    
        //VM(虚拟机)将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
        RUNTIME
    }

      4)Target、Retention、Documented、Inherited:4个元注解,可能看到这里,不知到元注解是个什么东东?继续往下看。

        Target:用于限定 注解标记的对象。

        @Documented  
        @Retention(RetentionPolicy.RUNTIME)//限定
        @Target(ElementType.ANNOTATION_TYPE)//限定 Target 注解,只用标记 注解。
        public @interface Target {
          ElementType[] value(); //Target注解的元素,类型为ElementType[],名称为 value
        }

         看到这里,你会发现 Target 注解的元素,是之前定义的枚举类型 ElementType的数组,里边可以是多个值。所以 Target 是用于 限定 注解 标记的范围,然后值是ElementType中的一个或者多个!

         那么元注解的定义:只能标记注解的注解,换句话说,所有的元注解只能标记注解,也就是 @Target 的值是 ElementType.ANNOTATION_TYPE

        Retention:用于限定 注解 的 在什么级别有效

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

         跟 Target 类似,Retention注解中元素的值是枚举类型 RetentionPolicy 的值,值只能是 RetentionPolicy 的一个,only one !!!

        Documented:用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解没有成员

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

        Inherited:是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

        注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

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

      到此,是不是对 java 注解 有一个初步的认识了,这肯定是不够的,最好的学习方法就是使用它!!!

      至于例子可以直接看这篇博客 (http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html)很详细!

      

    Read the fucking manual and source code
  • 相关阅读:
    Postfix邮件服务
    Python
    LVS
    MFS
    Apache
    Zookeeper集群 + Kafka集群 + KafkaOffsetMonitor 监控
    shell 检测安装包
    shell ssh 批量执行
    shell 判断脚本参数
    bzoj 1500 修改区间 splay
  • 原文地址:https://www.cnblogs.com/qxynotebook/p/6064042.html
Copyright © 2011-2022 走看看