深入理解Java的Annotation系列-第一部分 注解基础

来源:互联网 发布:四知文言文翻译注解 编辑:程序博客网 时间:2024/06/05 00:43

一、什么是Java的注解

    Java的注解是从JDK1.5开始引入的,大家在开发过程中,也时常在应用代码中会看到诸如@Override@Deprecated@SuppressWarnings这样的注解,而且在当前许多java框架中大量使用注解,如HibernateJerseySpringSpringMVCStruts2

那究竟什么是注解了?要理解这个概念,先要理解元数据(metadata)的概念。元数据从metadata一词翻译而来,就是用于描述数据的数据的意思,是最根本和原始的数据,在Java中元数据以标签的形式存在于Java代码中,元数据标签的存在并不影响程序代码的编译和执行,它只是被用来生成其它的文件或针在运行时知道被运行代码的描述信息。

注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释。

二、注解的作用

      1、生成文档,这是最常见的,也是Java 最早提供的注解。常用的有@see @param @return@author@since等,下面的例子是从JDK源码中摘取:

* @param<K> the type ofkeys maintained by this map

 * @param<V> the type of mapped values

 * @author  Doug Lea

 * @author  Josh Bloch

 * @author  Arthur van Hoff

 * @author  Neal Gafter

 * @see    Object#hashCode()

 * @see     Collection

 * @see     Map

 * @see     TreeMap

 * @see     Hashtable

 * @since   1.2

        2、跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。以后java的程序开发,最多的也将实现注解配置,具有很大用处。

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

三、为什么要引入注解

    在没有注解之前,XML被广泛的应用于描述元数据,但是一些开发人员发现XML的维护比较麻烦,如果配置信息很多,很难找到与配置的信息匹配的代码。他们希望使用一些和代码紧耦合的东西,而不是像XML那样和代码是松耦合的(在某些情况下甚至是完全分离的)代码描述。

     另一个很重要的因素是Annotation定义了一种标准的描述元数据的方式。

四、Annotation是如何工作的?

    Annotations仅仅是元数据,和业务逻辑无关。如果Annotations不包含业务逻辑,那么必须有人来实现这些逻辑。元数据的"使用者"来做这个事情,即实现业务逻辑。Annotations仅仅提供它定义的属性(/方法//)的信息。Annotations"使用者"(同样是一些代码)来读取这些信息并实现必要的逻辑。当我们使用Java的标注Annotations(例如@Override)时,JVM就是一个使用者,它在字节码层面工作。当我们使用用于Servlet的注解(例如@WebInitParam)时,容器就是一个'使用者';当我们使用框架提供的注解时,框架中的某个组件会负责做读取后的逻辑处理。

五、注解的分类

  根据注解使用方法和用途,我们可以将Annotation分为三类:
    1、JDK内置系统注解
    2、元注解
    3、自定义注解

六、JDK内置系统注解(Java中自带注解)

Java中,所有的注解包含如下:

    

   需要注意的是,java Java j2se中的类库,也就是java Development kit ,它提供也一些基础的东西,如io库、桌面程序的类库,如awt、集合库(如CollectionListMap)等这些最基础的类库,javax包是java的扩展包,j2ee中的类库,包括servletjspejb数据库 xml的等相关的一些东西。

    6.1 @Override

    它的作用是对覆盖超类中方法的方法进行标记,如果被标记的方法并没有实际覆盖超类中的方法,则编译器会发出错误警告。

public class ParentClass {

   public  void showAll() {

       System.out.println("parent class");

   }

}

public class ChildClass extends ParentClass {

    @Override

      public  void showAll(){

          System.out.println("Child class");

       }

}

   6.2 @Deprecated

   它的作用是对不应该再使用的方法添加注解,当编程人员使用这些方法时,将会在编译时显示提示信息。

public class Ademo {

    public static void main(String[]args) {

        // 使用DeprecatedClass里声明被过时的方法

          DeprecatedClass.DeprecatedMethod();

    }

static class DeprecatedClass {

    @Deprecated

    public static void DeprecatedMethod(){

    }

}

}

    6.3 @SuppressWarnings

其参数有:

deprecation:使用了过时的类或方法时的警告

unchecked:执行了未检查的转换时的警告

fallthrough: switch程序块直接通往下一种情况而没有 break时的警告

path:在类路径、源文件路径等中有不存在的路径时的警告

serial:当在可序列化的类上缺少serialVersionUID定义时的警告

finally:任何 finally子句不能正常完成时的警告

all:关于以上所有情况的警告

例子1

public void printDateAndTime() {

       Date date=new Date();

       @SuppressWarnings("deprecation")

       int datesdate.getDate();

       System.out.println(dates);

        

    }

例子2

    @SuppressWarnings("serial")

public class Stu implements Serializable{

   private int age;

 

public int getAge() {

    return age;

}

 

public void setAge(intage) {

    this.age =age;

}

}

 

6.4 @PostConstruct和@PreDestroy

    @PostConstruct@PreDestroy用于对Servlet的注解,前者用于构造Servlet对象之后进行的相关操作,而@PreDestroy用在销毁Servlet对象之前进行的相关操作

阅读全文
0 0
原创粉丝点击