现在的位置: 首页 > 综合 > 正文

Annotation学习入门的几篇文章

2013年02月27日 ⁄ 综合 ⁄ 共 2270字 ⁄ 字号 评论关闭

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。

本文出自:冯立彬的博客

抱歉!评论已关闭.