在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释。
首先,注解的概念是从JDK1.5才引入的,而且第一个版本不支持基于接口的注解,即诸如@Override之类的注解无法使用。所以,注解是用来修饰方法,参数,变量,构造器,类等的特殊工具,也称之为一种元数据——描述数据的数据。
简单的栗子:
@Override public String toString() { return name; }
上述方法的@Override注解,表示该方法从父类中继承,如果父类不存在此方法,或者方法名书写错误,就会提示错误,这样就避免了意外错误的发生。
该注解的源码为:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }
很简单的一个注解声明,没有做其他额外的任何工作。
@interface是注解声明的方式,类似于class、interface等。往往声明注解,会使用其他四个元注解,即JDK提供的用来修饰注解的注解,分别是:
@Target注解,使用格式@Target(ElementType),表示该注解的修饰目标,取值为:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention注解,使用格式@Retention(RetentionPolicy),表示该注解生效的实效范围,取值为:
1.SOURCE:在源文件中有效
2.CLASS:在class文件中有效,注解的默认方式
3.RUNTIME:在运行时有效,自定义注解常使用的工作方式
@Documented –注解是否将包含在JavaDoc中
@Inherited – 是否允许子类继承该注解
注解的所有属性都需要被定义为方法类型,比如:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation{ public enum LEVEL{L1, L2, L3} public enum Status {STARTED, END} String name() default "Min"; Priority level() default LEVEL.L1; Status status() default Status.END; }
该注解,提供配置参数为name,level和status且都提供了默认值,当使用注解的时候,参数的值可以取定义枚举的一个,或者String类型,任意String对象。
@MyAnnotation(level=MyAnnotation.LEVEL.L2, name= "Bruce", status =MyAnnotation.Status.STARTED)