如何编写子定义annotation及使用JDK5.0 annotation包中的annotations
2007-10-09 17:32
741 查看
这一小节介绍如何编写一个自定义的注解类型,以及如何应用JDK5.0java.lang.annotation包中提供的4种注解:
@Documented,@Retention,@Target,@Inherited
1.编写自定义@Todo注解
经常我们在写程序时,有时候有些功能在当前的版本中并不提供,或由于某些其它原因,有些方法没有完成,而留待以后完成,我们在javadoc中用@TODO来描述这一行为,下面用java注解来实现。
public@interfaceTodo{}//Todo.java
如果你想让这个注解类型能够自省的话,给它加上@Todo注解,写法如下:
@Todo
public@interfaceTodo{}
下面我们给这个注解接受参数的能力,代码如下:
注意:注解类性所能接受的参数类型有着严格的规则:
a.参数类型只能是:primitive,String,Class,enum,annotation,或者是数组;
b.参数值不能为空,因此每一个参数值都要定义一个缺省值;
c.名字为value的参数可以用简便的方法来设置;
d.参数的写法如同写简单方法(看如上代码),不允许加入参数,不允许有throws子句等。
在上面的代码中,我们为@Todo定义了3个参数,分别是value,owners,priority.注意:由于value的特殊性,它的的却省值可以由上面代码中的"Justarticleware"来定义,当然你也可以单独写一个缺省值。
下面看一个应用@Todo注解的例子:
上面的代码很简单,不多介绍。
下面我们想让@Todo不能应用在fields,parameters,或者localvariables(因为这对我们来说没有意义);它应当可以出现在javadoc中;在运行是具有持久性。要实现这些特性,就需要annotation包的支持啦。
2.应用annotation包的支持
1)@Documented
类和方法的annotation缺省情况下是不出现在javadoc中的,为了加入这个性质我们用@Documented
应用代码如下(简单,不多介绍):
2)@Retention
用来表明你的annotation的有效期,可以有三种选择(如图所示):
以下示例代码应用RUNTIME策略
3)@Target
@Target注解表明某个注解应用在哪些目标上,可选择如下范围:
ElementType.TYPE(class,interface,enum)
ElementType.FIELD(instancevariable)
ElementType.METHODElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE(应用于另一个注解上)
ElementType.PACKAGE
按我们的功能要求,代码如下:
4)@Inherited
@Inherited表明是否一个使用某个annotation的父类可以让此annotation应用于子类。
示例代码如下:
@Documented,@Retention,@Target,@Inherited
1.编写自定义@Todo注解
经常我们在写程序时,有时候有些功能在当前的版本中并不提供,或由于某些其它原因,有些方法没有完成,而留待以后完成,我们在javadoc中用@TODO来描述这一行为,下面用java注解来实现。
public@interfaceTodo{}//Todo.java
如果你想让这个注解类型能够自省的话,给它加上@Todo注解,写法如下:
@Todo
public@interfaceTodo{}
下面我们给这个注解接受参数的能力,代码如下:
@Todo("Justarticleware") public@interfaceTodo{ publicenumPriority{LOW,MEDIUM,HIGH} Stringvalue(); String[]owners()default""; Prioritypriority()defaultPriority.MEDIUM; }
注意:注解类性所能接受的参数类型有着严格的规则:
a.参数类型只能是:primitive,String,Class,enum,annotation,或者是数组;
b.参数值不能为空,因此每一个参数值都要定义一个缺省值;
c.名字为value的参数可以用简便的方法来设置;
d.参数的写法如同写简单方法(看如上代码),不允许加入参数,不允许有throws子句等。
在上面的代码中,我们为@Todo定义了3个参数,分别是value,owners,priority.注意:由于value的特殊性,它的的却省值可以由上面代码中的"Justarticleware"来定义,当然你也可以单独写一个缺省值。
下面看一个应用@Todo注解的例子:
@Todo( value="Classscope", priority=Unfinished.Priority.LOW ) publicclassTodoDemo{ @Todo("Constructorscope")//通过快捷方式,设置value的值 publicTodoDemo(){} @Todo(owner="Jason",value="Methodscope") publicvoidfoo(){} }
上面的代码很简单,不多介绍。
下面我们想让@Todo不能应用在fields,parameters,或者localvariables(因为这对我们来说没有意义);它应当可以出现在javadoc中;在运行是具有持久性。要实现这些特性,就需要annotation包的支持啦。
2.应用annotation包的支持
1)@Documented
类和方法的annotation缺省情况下是不出现在javadoc中的,为了加入这个性质我们用@Documented
应用代码如下(简单,不多介绍):
packagecom.robin; importjava.lang.annotation.*; @Todo("Justarticleware") @Documented public@interfaceTodo{...
2)@Retention
用来表明你的annotation的有效期,可以有三种选择(如图所示):
以下示例代码应用RUNTIME策略
packagecom.robin; importjava.lang.annotation.*; @Todo("Justarticleware") @Documented @Retention(RetentionPolicy.RUNTIME) public@interfaceTodo{...
3)@Target
@Target注解表明某个注解应用在哪些目标上,可选择如下范围:
ElementType.TYPE(class,interface,enum)
ElementType.FIELD(instancevariable)
ElementType.METHODElementType.PARAMETER
ElementType.CONSTRUCTOR
ElementType.LOCAL_VARIABLE
ElementType.ANNOTATION_TYPE(应用于另一个注解上)
ElementType.PACKAGE
按我们的功能要求,代码如下:
packagecom.robin;
importjava.lang.annotation.*;
@Todo("Justarticleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,
ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
ElementType.PACKAGE})
public@interfaceTodo{...
4)@Inherited
@Inherited表明是否一个使用某个annotation的父类可以让此annotation应用于子类。
示例代码如下:
packagecom.robin;
importjava.lang.annotation.*;
@Todo("Justarticleware")
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,
ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE,
ElementType.PACKAGE})
@Inherited
public@interfaceTodo{
publicenumPriority{LOW,MEDIUM,HIGH}
Stringvalue();
String[]owners()default"";
Prioritypriority()defaultPriority.MEDIUM;
}
相关文章推荐
- MyEclipse6.5.0 编写代码时如何显示提示以及Syntax error,annotations are only available if source level is 5.0的解决办法
- 无法转向JDK 5.0?学习一款开放源代码工具如何帮助在旧版 JVM 上使用这些特性
- 如何使用VS2010编写C程序
- 在编写PL/SQL代码中使用SELECT语句时如何避免例外发生
- 如何使用Python为Hadoop编写一个简单的MapReduce程序
- 在jbuilder2005中使用jdk5.0的新特性
- cocos2d-x 如何使用Visual Studio 2010和xcode 4混合编写手机游戏
- 面向对象_如何使用JDK提供的帮助文档
- 编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件
- 如何使用Createjs来编写HTML5游戏(三)使用EaselJS中的制作Sprite类制作
- Java千百问_02基本使用(011)_如何编写单线程Socket程序
- 如何使用Node.js编写命令工具——以vue-cli为例
- eclipse使用----如何在Eclipse中查看JDK类库的源代码
- Windows下如何使用QT编写dll程序
- Javaweb学习笔记——(七)——————myexlipse基本使用、jdk5.0新特性及反射讲解
- 如何查看项目使用的Eclipse版本和Jdk的版本
- windows下如何使用QT编写dll程序
- 如何利用C#编写网页投票器程序 如何使用代理来投票 代理IP来投票
- Android 5.0后Material design icons(金属设计风格图标大全)及如何使用