1、http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html,这个是官方网站的入门示例,讲解决 了annotation的几种类型,可以用于:
1)、给编译器提供相应的信息,如错误检测及警告;
2)、为编译及打包时的提供处理行为,如生成代码、生成XML文件等,常用的就是@Document用于生成JDK文档;
3)、运行时处理。
这篇文章提供了警告及编译时生成文档的示例,并且后面附有两个练习题,可以帮助巩固对annotation的理解;不过不足之处就是没有对运行时的annotaion提供示例,不过毕竟是官方文档,值得一看。
2、http://www.kodejava.org/examples/501.html,这篇文档提供了一个创建一个简单的annotation的示例,提到了annotation的语法结构,并对三种保留策略(RetentionPolicy)进行说明:
1)、RetentionPolicy.CLASS,如果编译的annotation没有写Retention声明保留策略,那么默认的保留策略是Retention.CLASS,表示在编译的时候声明会保留到class文件中,但是在运行的时候是无效的;
2)、RetentionPolicy.SOURCE,表示这个保留策略只是用于语法检查的,在编译成class文件时就被去掉了,不会保留在class文件中,如常见的@Override和@SuppressWarnings就是属于这种保留类型,如java.lang.Override的源码:
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }3)、RetentionPolicy.RUNTIME,运行时起效果的,如常见的@Deprecated就是。
简单易懂,也值得一看。
3、http://www.kodejava.org/examples/503.html,看了第二篇文章后,可以继续看这篇,这篇是在上面一篇简单annotation的基础之上做的一个示例,内容不多,基本上就是一个程序,一看就懂。不过我觉得其中有些地方需要优化一下,如原文中的:
for (Annotation anno : annotations) { System.out.println("Annotation Type: " + anno.annotationType()); } HelloAnno anno = (HelloAnno) clazz.getAnnotation(HelloAnno.class); System.out.println("Anno Value : " + anno.value()); System.out.println("Anno GreetTo: " + anno.greetTo());上面的例子只是适合当前确定已经有了annotation的示例才会成功,如果这个类把annotation去掉或者写了其它的annotaion,运行就会报错了,写成下面这种会更好:
for (Annotation anno : annotations) { System.out.println("Annotation Type: " + anno.annotationType()); if (anno.annotationType().isAssignableFrom(HelloAnno.class)) { HelloAnno helloAnno = (HelloAnno) anno; System.out.println("Anno Value : " + helloAnno.value()); System.out.println("Anno GreetTo: " + helloAnno.greetTo()); } }同理,其中对方法annotation的处理:
Method m = getClass().getMethod("sayHello"); HelloAnno anno = m.getAnnotation(HelloAnno.class); System.out.println(anno.value() + " " + anno.greetTo());也应该修改成下面的,以免报错:
Method m = clazz.getMethod("sayHi"); if (m.isAnnotationPresent(HelloAnno.class)) { anno = m.getAnnotation(HelloAnno.class); System.out.println("Anno Value : " + helloAnno.value()); System.out.println("Anno GreetTo: " + helloAnno.greetTo()); }4、 http://www.blogjava.net/hain/articles/84512.html,这是一篇国人写的文章,其中最值得看的就是对JDK自带的几个常用annotation的源码文析,熟悉了@Target、@Document、@Retention几个annotation,那自己编写的annotation就不会湖里湖涂了。
如果是新手入门,以上的几篇文章最好是按照我例的顺序看,花两个小时,保证你能够熟悉annotation以及知道如何处理annotation。
本文出自:冯立彬的博客