从JDK5.0开始,Java增长了对元数据(MetaData)的支持,也就是Annotation(注解,也有地方称之为注释),其实说白了就是代码里的特殊标记,这些标记能够在编译、类加载、运行时被读取,并执行相应的处理。经过使用Annotation,程序开发人员能够在不改变原有逻辑的状况下,在源文件嵌入一些补充的信息。代码分析工具、开发工具和部署工具能够经过这些补充信息进行验证或者进行部署。java
Annotation提供了一条为程序元素设置元数据的方法,从某些方面来看,Annotation就像修饰符同样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被存储在Annotation的“name=value”对中。Annotation是一个接口,程序能够经过反射来获取指定程序元素的Annotation对象而后经过Annotation对象取得注释里的元数据。编程
Annotation能被用来为程序元素(类、方法、成员变量等)设置元数据。值得指出的是:Annotation不能影响程序代码执行,不管增长、删除Annotation,代码都始终如一地执行。若是但愿让程序中的Annotation能在运行时起必定做用,只有经过某种配套的工具对Annotation中的信息进行访问和处理,访问和处理Annotation的工具统称APT(AnnotationProcessing Tool)。eclipse
@Override就是用来指定方法重写的,它能够强调一个子类必需要覆盖父类的方法。以下程序中使用@Override指定子类Apple的info方法必须重写父类方法ide
若是重写的方法名以及参数与父类一直那么看不出@Override什么做用,可是若是重写的方法与父类的方法不一致,那么程序将在编译阶段出错。也就是说这个注解的做用就是帮助咱们避免一些低级错误。工具
@Deprecated用于表示某个程序元素(类、方法等)已过期,当其余程序使用已过期的类、方法时,编译器将会给出警告。以下程序指定Apple类中的info方法已过期,其余程序中使用Apple类的info方法时编译器将会给出警告。开发工具
在eclipse中标注此注解的方法会被删除线标记出来,以引发编程人员的注意。测试
@SuppressWarnings指示被Annotation标识的程序元素(以及在该程序元素中的全部子元素)取消显示指定的编译器警告。@SuppressWarnings会一直做用于该程序元素的全部子元素,例如使用@SuppressWarnings标识的一个类来取消显示某个编译器警告,同时又标识该类里某个方法取消显示另外一个编译器警告,那么在此方法中同时取消显示这两个编译器警告。ui
一般状况下若是程序中使用没有泛型限制的集合将会引发编译器警告,为了不这种编译器警告,可使用@SuppressWarnings这个注解,下面程序取消了没有使用泛型的编译器警告。.net
正如程序中所看到的,当咱们使用此注解来关闭编译器警告时,必定须要在括号里使用name=value对来为该注解成员变量设置值。对象
以上就是对注解的一个简单的介绍
本文将介绍Annotation的原理,以及如何自定义Annotation,并利用Annotation来完成一些实际的功能。
定义Annotation
定义新的Annotation类型使用@interface关键字,这从必定意义上说明Annotation和接口的定义是有类似之处的。以下代码定义了一个Annotation
使用Annotation
定义了Annotation以后就能够在程序的任何地方使用该Annotation,对于Annotation的使用和public、final这样的修饰符很像,一般能够修饰类、方法、变量、接口等定义(默认状况下,Annotation用于修饰任何程序元素)。以下代码,就是使用了上面的Annotation修饰方法。
提取Annotation
一个类或者一个方法使用Annotation修饰以后须要经过反射来提取Annotation的信息。须要注意当一个Annotation类型被定义为运行时Annotation后该注释才是运行时可见的,当class文件被装载时被保存在class文件中的Annotation才会被虚拟机读取。下面代码就是将Annotation信息提取出来,根据这些信息进行相应的操做。在这里是若是某个方法被标记为能够测试的则调用这个方法。
其中程序的主程序以下
运行结果以下
工做原理
上面仅仅是一个简单地Annotation的使用,更复杂一些的Annotation与上面的这个例子原理是同样的,只不过相应的逻辑判断以及涉及到的Annotation中的内容较为复杂而已。可是核心的部分就是借助一个操做类经过反射的方式提取Annotation信息,进行操做,简而言之:无反射,不注释(Annotation)。
原文连接:http://blog.csdn.net/beijiguangyong/article/details/8685452