如何编写子定义annotation及使用JDK5.0 annotation包中的annotations

转载 2007年10月09日 17:32:00
这一小节介绍如何编写一个自定义的注解类型,以及如何应用JDK5.0 java.lang.annotation包中提供的4种注解:
@Documented,@Retention,@Target,@Inherited

1. 编写自定义@Todo注解
经常我们在写程序时,有时候有些功能在当前的版本中并不提供,或由于某些其它原因,有些方法没有完成,而留待以后完成,我们在javadoc中用@TODO来描述这一行为,下面用java注解来实现。

public @interface Todo { } // Todo.java

如果你想让这个注解类型能够自省的话,给它加上@Todo注解,写法如下:

@Todo
public @interface Todo{ }


下面我们给这个注解接受参数的能力,代码如下:
@Todo("Just articleware")
public @interface Todo{
public enum Priority { LOW, MEDIUM, HIGH }
String value();
String[] owners() default "";
Priority priority() default Priority.MEDIUM;
}

注意注解类性所能接受的参数类型有着严格的规则:
a. 参数类型只能是:primitive, String, Class, enum, annotation, 或者是数组;
b. 参数值不能为空,因此每一个参数值都要定义一个缺省值;
c. 名字为value的参数可以用简便的方法来设置;
d. 参数的写法如同写简单方法(看如上代码),不允许加入参数,不允许有throws子句等。

在上面的代码中,我们为@Todo定义了3个参数, 分别是value, owners, priority. 注意:由于value的特殊性,它的的却省值可以由上面代码中的"Just articleware"来定义,当然你也可以单独写一个缺省值。

下面看一个应用@Todo注解的例子:
@Todo(
value="Class scope",
priority=Unfinished.Priority.LOW
)
public class TodoDemo {

@Todo("Constructor scope")//通过快捷方式,设置value的值
public TodoDemo() { }

@Todo(owner="Jason", value="Method scope")
public void foo() { }
}

上面的代码很简单,不多介绍。

下面我们想让@Todo不能应用在fields, parameters, 或者local variables(因为这对我们来说没有意义);它应当可以出现在javadoc中;在运行是具有持久性。要实现这些特性,就需要annotation包的支持啦。

2. 应用annotation包的支持

1)@Documented
类和方法的annotation缺省情况下是不出现在javadoc中的,为了加入这个性质我们用@Documented
应用代码如下(简单,不多介绍):
package com.robin;
import java.lang.annotation.*;

@Todo("Just articleware")
@Documented
public @interface Todo{ ...


2)@Retention
用来表明你的annotation的有效期,可以有三种选择(如图所示):

以下示例代码应用RUNTIME策略
package com.robin;
import java.lang.annotation.*;

@Todo("Just articleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Todo{ ...

3) @Target
@Target注解表明某个注解应用在哪些目标上,可选择如下范围:
  • ElementType.TYPE (class, interface, enum)
  • ElementType.FIELD (instance variable)
  • ElementType.METHOD ElementType.PARAMETER
  • ElementType.CONSTRUCTOR
  • ElementType.LOCAL_VARIABLE
  • ElementType.ANNOTATION_TYPE (应用于另一个注解上)
  • ElementType.PACKAGE

按我们的功能要求,代码如下:
package com.robin;
import java.lang.annotation.*;

@Todo("Just articleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,
ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
ElementType.PACKAGE})
public @interface Todo{ ...

4) @Inherited
@Inherited表明是否一个使用某个annotation的父类可以让此annotation应用于子类。
示例代码如下:
package com.robin;
import java.lang.annotation.*;

@Todo("Just articleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,
ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
ElementType.PACKAGE})
@Inherited
public @interface Todo{
public enum Priority { LOW, MEDIUM, HIGH }

String value();
String[] owners() default "";
Priority priority() default Priority.MEDIUM;
}
 

MyBatis Annotation配置

MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置。MyBatis提供的一些基本注解如下表所示。 注解 目标 相应的XM...
  • qqlrq
  • qqlrq
  • 2015-05-20 20:02:29
  • 2585

Android开源框架(一):AndroidAnnotations

Android开源框架(一):AndroidAnnotations AndroidAnnotations是一个能够让你快速进行Android开发的开源框架,它能让你专注于真正重要的地方。 使代码更加精...
  • zjbpku
  • zjbpku
  • 2014-01-23 00:02:08
  • 77534

深入理解Java:自定义注解入门(Annotation)

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:...
  • zhuyuehui99
  • zhuyuehui99
  • 2017-02-25 10:19:37
  • 665

TestNG教程系列三:注解annotation及执行情况

在上一篇文章中,我们可能最疑惑的是@Test类似的注解是什么
  • boer521314
  • boer521314
  • 2014-10-23 23:45:02
  • 2603

Android注解框架Annotations从配置到应用

最近在看一个新的基于注解开发的项目,了解到Android中同样存在一些注解框架,能够大大提高我们的编码规范和效率,减少代码量。本文主要分为两部分,针对较热门的注解框架Android Annotatio...
  • IT_ZJYANG
  • IT_ZJYANG
  • 2016-06-29 00:30:00
  • 2878

java_annotation

java 注解 定义注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方...
  • u013108408
  • u013108408
  • 2016-07-20 20:37:17
  • 1118

IntelliJ IDEA下配置AndroidAnnotations

发现如何IntelliJ IDEA下配置AndroidAnnotations国内没有任何教程,感觉有必要分享一下自己遇到的问题并如何ji...
  • tz2101
  • tz2101
  • 2014-05-06 13:28:44
  • 2011

annotations.jar

  • 2014年04月19日 21:06
  • 1KB
  • 下载

Spring的Annotation支持

请自行在所有的Annotation上将#换为艾特符号! 由于现在的主流Java框架受到了Rails框架的启发,开始渐渐的疏远XML配置方式,Spring也不例外,也支持使用Annotation来代替X...
  • AZHELL
  • AZHELL
  • 2017-03-19 12:44:34
  • 787

Java自定义AnnotationProcessor处理自己的Annotation

Java使用Annotation Processor获取代码中的Annotation使用Java的Annotation Processing Tool (apt)可以在编译期获取Java代码文件中的A...
  • NUPTboyZHB
  • NUPTboyZHB
  • 2016-03-30 19:09:28
  • 6107
收藏助手
不良信息举报
您举报文章:如何编写子定义annotation及使用JDK5.0 annotation包中的annotations
举报原因:
原因补充:

(最多只允许输入30个字)