如何编写子定义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;
}
 

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

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

【spring框架】spring使用Annotation进行声明式事务管理

声明式的事务管理 a)事务加在DAO层还是Service层? UserService调了UserDao,调了它的save方法,而UserDao它会去访问数据库。 在Dao里面,事务的还是就是save...
  • u013517797
  • u013517797
  • 2015年03月26日 16:42
  • 981

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

如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处...
  • changsimeng
  • changsimeng
  • 2017年03月22日 10:35
  • 731

Java Annotation详解(一): 理解和使用Annotation

JDK1.5之后,引入了元数据的概念,也就是Annotation(注释),
  • zuiwuyuan
  • zuiwuyuan
  • 2014年10月09日 08:53
  • 6537

Struts2 Annotation配置(要jar包,看这里)

Struts2 Annotation在官网上叫零配置文件(就是可以没有struts2.xml),通过java annotation注释来代替struts2.xml文件。 这是官网上的资料,可以参...
  • finethere
  • finethere
  • 2014年06月20日 13:19
  • 931

Java Annotation详解+自定义java注解(一)

java annotation的详解,元注解的详解 注解的注解: 我们可以通过元注解来实现一个自定义的HelloWorld注解...
  • emilyRR
  • emilyRR
  • 2015年08月07日 21:52
  • 1423

深入理解Java:注解(Annotation)基本概念

原文:http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html        什么是注解(Annotation):   Ann...
  • erlian1992
  • erlian1992
  • 2016年11月29日 23:50
  • 1300

Android Annotation注解的剖析和使用

都说Annotation的运用非常简单,但真正我们需要下手实现的的时候,有的时候就不知道从哪里下手,为什么我们觉得很简单的东西,但却无法下手呢? 原因只有一个,我们对它的使用非常少...
  • jxxfzgy
  • jxxfzgy
  • 2015年02月14日 15:58
  • 2360

Annotation(一)——注解开发介绍

在编程中,一直强调的一点就是注释的编写,注释的规范等等。尤其是越是核心,程序越复杂,逻辑越多的清空下,注释的编写对我们以后的阅读代码,维护软件起着至关重要的作用。一款软件有着好的注释,相当于一个中国人...
  • liujiahan629629
  • liujiahan629629
  • 2014年03月27日 22:10
  • 7624

spring中annotation的常用注解

使用方法 在bean.xml文件中加入
  • u010513756
  • u010513756
  • 2016年01月01日 21:03
  • 5763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何编写子定义annotation及使用JDK5.0 annotation包中的annotations
举报原因:
原因补充:

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