Java注解提供了关于代码的一些信息,但并不直接做用于它所注解的代码内容。在这个教程当中,咱们将学习Java的注解,如何定制注解,注解的使用以及如何经过反射解析注解。java
Java1.5引入了注解,当前许多Java框架中大量使用注解,如Hibernate、Jersey、Spring。注解做为程序的元数据嵌入到程序当中。注解能够被一些解析工具或者是编译工具进行解析。咱们也能够声明注解在编译过程或执行时产生的做用。web
在使用注解以前,程序源数据只是经过Java注释和javadoc,可是注解提供的功能要远远超过这些。注解不只包含了元数据,它还能够做用于程序运行过程当中、注解解释器能够经过注解决定程序的执行顺序。例如,在Jersey webservice咱们为方法添加URI字符串的形式的**PATH**
注解,那么在程序运行过程当中jerser解释程序将决定该方法去调用所给的URI。数组
建立Java自定义注解框架
建立自定义注解和建立一个接口类似,可是注解的interface关键字须要以@符号开头。咱们能够为注解声明方法。咱们先来看看注解的例子,而后咱们将讨论他的一些特性。ide
package com.journaldev.annotations;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Documented@Target(ElementType.METHOD)@Inherited@Retention(RetentionPolicy.RUNTIME) public @interface MethodInfo{ String author() default 'Pankaj'; String date(); int revision() default 1; String comments();}
注解方法不能带有参数;工具
注解方法返回值类型限定为:基本类型、String、Enums、Annotation或者是这些类型的数组;学习
注解方法能够有默认值;spa
注解自己可以包含元注解,元注解被用来注解其它注解。.net
这里有四种类型的元注解:code
@Documented —— 指明拥有这个注解的元素能够被javadoc此类的工具文档化。这种类型应该用于注解那些影响客户使用带注释的元素声明的类型。若是一种声明使用Documented进行注解,这种类型的注解被做为被标注的程序成员的公共API。
@Target ——指明该类型的注解能够注解的程序元素的范围。该元注解的取值能够为TYPE,METHOD,CONSTRUCTOR,FIELD等。若是Target元注解没有出现,那么定义的注解能够应用于程序的任何元素。
@Inherited——指明该注解类型被自动继承。若是用户在当前类中查询这个元注解类型而且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动做将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。
@Retention——指明了该Annotation被保留的时间长短。RetentionPolicy取值为SOURCE,CLASS,RUNTIME。
Java内建注解
Java提供了三种内建注解。
@Override——当咱们想要复写父类中的方法时,咱们须要使用该注解去告知编译器咱们想要复写这个方法。这样一来当父类中的方法移除或者发生更改时编译器将提示错误信息。
@Deprecated——当咱们但愿编译器知道某一方法不建议使用时,咱们应该使用这个注解。Java在javadoc中推荐使用该注解,咱们应该提供为何该方法不推荐使用以及替代的方法。
@SuppressWarnings——这个仅仅是告诉编译器忽略特定的警告信息,例如在泛型中使用原生数据类型。它的保留策略是SOURCE(译者注:在源文件中有效)而且被编译器丢弃。
咱们来看一个Java内建注解的例子参照上边提到的自定义注解。
package com.journaldev.annotations;import java.io.FileNotFoundException;import java.util.ArrayList;import java.util.List;public class AnnotationExample {public static void main(String[] args) {}@Override@MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 1)public String toString() { return 'Overriden toString method';}@Deprecated@MethodInfo(comments = 'deprecated method', date = 'Nov 17 2012')public static void oldMethod() { System.out.println('old method, don't use it.'); } @SuppressWarnings({ 'unchecked', 'deprecation' }) @MethodInfo(author = 'Pankaj', comments = 'Main method', date = 'Nov 17 2012', revision = 10) public static void genericsTest() throws FileNotFoundException { List l = new ArrayList(); l.add('abc'); oldMethod(); } }
相信这个例子能够不言自明并能展现在不一样场景下的应用。
Java注解解析
咱们将使用反射技术来解析Java类的注解。那么注解的RetentionPolicy应该设置为RUNTIME不然Java类的注解信息在执行过程当中将不可用,那么咱们也不能从中获得任何和注解有关的数据。
package com.journaldev.annotations;import java.lang.annotation.Annotation;import java.lang.reflect.Method;public class AnnotationParsing {public static void main(String[] args) { try { for (Method method : AnnotationParsing.class .getClassLoader() .loadClass(('com.journaldev.annotations.AnnotationExample')) .getMethods()) { // checks if MethodInfo annotation is present for the method if (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) { try { // iterates all the annotations available in the method for (Annotation anno : method.getDeclaredAnnotations()) { System.out.println('Annotation in Method ''+ method + '' : ' + anno); } MethodInfo methodAnno = method.getAnnotation(MethodInfo.class); if (methodAnno.revision() == 1) { System.out.println('Method with revision no 1 = '+ method); } } catch (Throwable ex) { ex.printStackTrace(); } } } } catch (SecurityException | ClassNotFoundException e) { e.printStackTrace(); } }}
运行上面程序将输出:
1 Annotation in Method 'public java.lang.String com.journaldev.annotations.AnnotationExample.toString()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=Main method, date=Nov 17 2012)2 Method with revision no 1 = public java.lang.String com.journaldev.annotations.AnnotationExample.toString()3 Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @java.lang.Deprecated()4 Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.oldMethod()' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=1, comments=deprecated method, date=Nov 17 2012)5 Method with revision no 1 = public static void com.journaldev.annotations.AnnotationExample.oldMethod()6 Annotation in Method 'public static void com.journaldev.annotations.AnnotationExample.genericsTest() throws java.io.FileNotFoundException' : @com.journaldev.annotations.MethodInfo(author=Pankaj, revision=10, comments=Main method, date=Nov 17 2012)
这就是该教程的所有内容,但愿你能够从中学到些东西。