Java注解

来源:互联网 发布:js收藏地址 编辑:程序博客网 时间:2024/06/06 23:52

        在新生项目中,使用了注解,但是对于注解的形成、作用等一系列知识还不是很懂,找了视频和博客总结了一下,给大家分享。


    1、我们为什么要使用注解?

    使用Annotation之前,XML被广泛的应用于描述元数据。后来一些应用开发人员和架构师发现XML的维护越来越糟糕了。他们希望使用一些和代码紧耦合的东西,而不是像XML那样和代码是松耦合的(在某些情况下甚至是完全分离的)代码描述。
    假如你想为应用设置很多的常量或参数,这种情况下,XML是一个很好的选择,因为它不会同特定的代码相连。如果你想把某个方法声明为服务,那么使用Annotation会更好一些,因为这种情况下需要注解和方法紧密耦合起来,开发人员也必须认识到这点。
    另一个很重要的因素是Annotation定义了一种标准的描述元数据的方式。在这之前,开发人员通常使用他们自己的方式定义元数据。例如,使用标记interfaces,注释,transient关键字等等。每个程序员按照自己的方式定义元数据,而不像Annotation这种标准的方式。
    目前,许多框架将XML和Annotation两种方式结合使用,平衡两者之间的利弊。


    2、注解的简介及使用方式

    从JDK5.0开始,Java增加了对元数据(MetaData)的支持,元数据是描述数据的数据,Annotation注解就可以看做为元数据。

    注解其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。他依靠反射机制来实现。通过使用注解,我们可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。

    注解可以向修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在注解的"name = value"对中,其实也就是K-V键值对。下面会有一些小例子供大家参考。

    注解能被用来为程序元素(类,方法,成员变量等)设置元数据。

    使用注解时只需要在其前面加一个@符号就可以了,把它当成一个修饰符来使用,修饰它所支持的程序元素。

    在Java中,有三个基本的注解:

   (1)、@Override:限定重写父类方法,该注释只能用于方法

   (2)、@Deprecated:用于表示某个程序元素(类,方法等)已过时

   (3)、@SuppressWarnings:抑制编译器警告。

    例子:Target的Java注解

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

             3、自定义注解

    自定义新的注解也要使用@interface关键字,其成员变量在注解定义中一无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。

    可以在定义注解的成员变量是为其制定初始值,制定成员变量的初始值可使用default关键字。

    对于没有成员定义的注解称为标记;包含成员变量的注解称为元数据注解

    

 /* Demo:  * 1.使用@interface定义注解   * 2.使用类似于接口方法声明的方式来定义注解的属性:其中返回值称为属性的类型,方法名为属性名称。  *///定义注解public @interface HelloAnnotation{        public String name();}//定义带有初值abc的注解public @interface HelloAnnotationWithValue{        public String name() default "abc";}//其他类中使用注解class A{    @HelloAnnotation(name="abc")         void methodA(){}}
    

    4、元注解

    JDK含有元注解,他们用于修饰其他注解定义。

    简单介绍几个:

   (1)@Retention:只能用于修饰一个注解定义,用于指定该注解可以保留多长时间。@Retention包含一个RetentionPolicy的成员变量,使用时必须为该value成员变量赋值。

    RetentionPolicy.CLASS,编译器将把注释记录在class文件中,当运行Java程序时,JVM不会保留注解,这是默认值;

    RetentionPolicy.RUNTIME(上面@Target中用到了),编译器也会把注解记录在class文件中,当运行Java程序时,JVM保留注解,程序可以通过反射获取该注解。

    RetentionPolicy.SOURCE:编译器直接丢弃这种策略的注解。

   (2)@Target:用于修饰注解定义,指定被修饰的注解能用于修饰那些程序元素。@Target也包含一个名为value的成员变量。

    如:@Target(value={ElementType.METHOD})

   (3)@Documented:用于指定被该元注解修饰的注解类将被javadoc工具提取成文档。

   (4)@Inherited:被他修饰的注解将具有继承性,如果某各类使用了此类注解修饰的注解,则其子类将自动拥有该注解。

    

     小结:注解的一些理论和使用方面的知识介绍的差不多了,只是关于它具体怎么用的反射笔者还没完全明白,在接下来的学习中,会继续学习并和大家探讨。




0 0