您的位置:首页 > 编程语言 > Java开发

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

2017-08-22 17:20 901 查看
一、什么是Java的注解

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

那究竟什么是注解了?要理解这个概念,先要理解元数据(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、集合库(如Collection、List、Map)等这些最基础的类库,javax包是java的扩展包,如j2ee
中的类库,包括servlet、jsp、ejb、数据库
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
dates=  date.getDate();
       System.out.println(dates);
        
    }

例子2:

    @SuppressWarnings("serial")
public
class
Stu implements Serializable{
   private
int
age;
 
public
int
getAge() {
    return
age;
}
 
public
void
setAge(int
age) {
    this.age =
age;
}
}

 

6.4 @PostConstruct和@PreDestroy
    @PostConstruct和@PreDestroy用于对Servlet的注解,前者用于构造Servlet对象之后进行的相关操作,而@PreDestroy用在销毁Servlet对象之前进行的相关操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息