java annotation是如何生效的,java中annotation是什么意思
摘要:
本文为java初学者或首次使用注释的用户全面讲解了注释的用法、定义和分类。初学者可以通过以上说明进行简。
单个注释程序,但是对于一些高级的注释应用程序(比如使用自定义注释来生成javabean mapping xml文件)
需要进一步的研究和讨论。笔者将在下文《Java Annotation高级应用》中谈及深度注解的内容。
同时,注释可以以两种方式运行:运行时和编译时。上面讨论的所有注释应用程序都是运行时的,但是没有涉及编译时的注释应用程序。
首先,为什么使用注释:
在JAVA应用中,我们经常会遇到一些模板代码。例如,为了编写JAX-RPC web服务,我们必须提供一对接口和实现作为模板代码。如果使用注释来修改远程访问的方法代码,该模板可以由工具自动生成。
此外,一些API需要使用与程序代码同时维护的辅助文件。例如,JavaBeans需要一个BeanInfo。
类是用Bean来使用/维护的,而EJB也需要一个部署描述符。这时候在程序中使用注释来维护这些附件的信息就非常方便了。
并且减少了误差。
二。注释工作模式:
5.0版之前的Java平台已经有了一些ad hoc。
注释机制。例如,在序列化子系统中,应该忽略使用瞬态修饰符来标识成员变量。并且@弃用了这个
Javatag也是一个特设的。
注释用于表示方法已经过时。自从Java5.0版本5.0发布以来,5.0平台提供了正式的注释功能:允许开发人员定义和使用
它自己的声明类型。该函数通过定义注释类型的语法和描述注释声明的语法读取注释aion。
API,一个用注释修饰的类文件,以及一个注释处理工具(apt)。
注释并不直接影响代码的语义,但它的工作方式被视为类似于程序的工具或类库,反过来会影响运行程序的语义。注释可以从源文件、类文件中读取,或者在运行时以多种方式反映出来。
当然,注释在一定程度上使得javadoc标签更加完整。一般来说,如果这个标签影响或者用于生成java文档,就应该作为javadoc标签使用;否则,它将被用作注释。
三。注释的用法:
1。类型声明方法:
一般来说,应用程序不必定义注释类型,但是定义注释类型并不困难。批注类型声明与一般的接口声明非常相似,只是它在接口关键字前面使用了“@”符号。
注释
类型的每个方法声明定义一个批注类型成员,但方法声明不必有参数或异常声明;返回值的类型仅限于以下几种:
先前类型的原语、字符串、类、枚举、注释和数组;方法可以有默认值。
下面是一个简单的注释类型声明:
清单1:
/**
*描述了导致以下情况的增强请求(RFE)
*注释API元素的存在。
*/
public @ interface request for enhancement {
int id();
string synopsis();
字符串工程师()默认“[未赋值]”;
string date();默认“[未实现]”;
}
代码中只定义了一个批注类型RequestForEnhancement。
2。修饰方法的注释声明:
注释
是一个修饰符,可以像其他修饰符一样常用(比如public、static、final)。这个习语是用在其他修饰语之前的注释。
注释由“@注释类型括号内的成员值列表”组成。这些成员的值必须是编译时常量(即在运行时不变)。
答:以下是使用requestforenhancement批注的方法语句:
清单2:
@RequestForEnhancement(
id=2868724,
大纲=启用时间旅行,
工程师=皮博迪先生,
日期= 3007年4月1日
)
公共静态无效旅行时间(日期目的地){.}
乙:当声明一个没有成员的注释类型声明时,可使用以下方式:
清单3:
/**
*表示带注释的应用程序接口元素的规范
*是初步数据,可能会有变化。
*/
公共@接口初步{ }
作为上面没有成员的注释类型声明的简写方式:
清单4:
@初级公开课时间旅行{.}
丙:如果在附注中只有唯一一个成员,则该成员应命名为价值:
清单5:
/**
*将版权声明与带注释的应用程序接口元素相关联。
*/
公共@接口版权{
字符串值();
}
更为方便的是对于具有唯一成员且成员名为价值的注释(如上文),在其使用时可以忽略掉成员名和赋值号(=):
清单6:
@版权( 2002优达因推进系统)
公共级振荡过推进器{.}
3。一个使用实例:
结合上面所讲的,我们在这里建立一个简单的基于注释测试框架。首先我们需要一个注释类型来表示某个方法是一个应该被测试工具运行的测试方法。
清单7:
导入Java。郎。注释。*;
/**
*表示带注释的方法是测试方法。
*此批注应该只用于无参数的静态方法。
*/
@保留(保留政策.运行时间)
@Target(ElementType .方法)
公共@接口测试{ }
值得注意的是注释类型声明是可以标注自己的,这样的注释被称为元注释。
在上面的代码中,@Retention(RetentionPolicy .运行时间)这个元注释表示了此类型的
注释将被虚拟机保留使其能够在运行时通过反射被读取。而@Target(ElementType .方法)表示此类型的
注释只能用于修饰方法声明。
下面是一个简单的程序,其中部分方法被上面的注释所标注:
清单8:
公共类Foo
@Test public static void m1() { }
公共静态void m2() { }
@Test public static void m3() {
抛出新的运行时异常(“Boom”);
}
公共静态void m4() { }
@测试公共静态void m5() { }
公共静态void m6() { }
@Test public static void m7() {
引发新的运行时异常(“崩溃”);
}
公共静态void m8() { }
}
这是测试工具:
导入Java。郎。反思。*;
公共类运行测试{
公共静态void main(String[] args)引发异常{
(同Internationalorganizations)国际组织通过=0,失败=0;
对于(方法m : Class.forName(args[0]).getMethods()) {
if(m . isanationpresent(test。class)){
尝试{
调用(空);
通过了;
} catch (Throwable ex) {
System.out.printf(测试%s失败:%s %n ,m,ex。get cause());
失败了;
}
}
}
System.out.printf(通过:%d,失败%d%n ,通过,失败);
}
}
个程序从命令行参数中取出类名,并且遍历此类的所有方法,尝试调用其中被上面的测试注释类型标注过的方法。在此过程中为了找出哪些方法被
注释类型标注过,需要使用反射的方式执行此查询。如果在调用方法时抛出异常,此方法被认为已经失败,并打印一个失败报告。最后,打印运行
通过/失败的方法数量。
下面文字表示了如何运行这个基于注释的测试工具:
清单9:
$ java RunTests Foo
测试公共静态void Foo.m3()失败:Java。郎。运行时异常:Boom
测试公共静态void Foo.m7()失败:Java。郎。运行时间异常:崩溃
通过:2,未通过2
四、注释分类:
根据注释的使用方法和用途主要分为以下几类:
1。内建注释——Java5.0版在爪哇岛语法中经常用到的内建注释:
@已弃用用于修饰已经过时的方法;
@覆盖用于修饰此方法覆盖了父类的方法(而非重载);
@ SuppressWarnings用于通知爪哇岛编译器禁止特定的编译警告。
下面代码展示了内建注释类型的用法:
清单10:
包com。bjinfotech。练习。注释;
/**
* 演示如何使用java5内建的注释
* 参考资料:
* http://Java。星期日com/docs/books/tutorial/Java/Java oo/annotations。超文本标记语言
* http://Java。星期日com/J2SE/1。5 .0/docs/guide/language/批注。超文本标记语言
* http://mindprod.com/jgloss/annotations.html
* @作者cleverpig
*
*/
导入Java。util。列表;
使用内置注释的公共类{
//食物类
食物类{}
//干草类
干草类延伸食物{}
//动物类
动物类{
Food getFood(){
返回空
}
//使用注释声明反对方法
@已弃用
void deprecatedMethod(){
}
}
//马类-继承动物类
级马伸展动物{
//使用注释声明覆盖方法
@覆盖
Hay getFood(){
返回新干草();
}
//使用注释声明禁止警告
@取消警告({ 不赞成,未选中 })
void callDeprecatedMethod(列出马群){
动物安=新动物();
安。不推荐使用的方法();
马群。添加(一个);
}
}
}
2。开发者自定义注释:由开发者自定义注释类型。
下面是一个使用注释进行方法测试的样本:
AnnotationDefineForTestFunction类型定义如下:
清单11:
包com。bjinfotech。练习。注释;
导入Java。郎。注释。*;
/**
* 定义注释
* @作者cleverpig
*
*/
//加载在伏特计中,在运行时进行映射
@保留(保留政策.运行时间)
//限定此注释只能标示方法
@Target(ElementType .方法)
public @ interface AnnotationDefineForTestFunction { }
测试注释的代码如下:
清单12:
包com。bjinfotech。练习。注释;
导入Java。郎。反思。*;
/**
* 一个实例程序应用前面定义的批注:AnnotationDefineForTestFunction
* @作者cleverpig
*
*/
使用批注的公共类{
@ AnnotationDefineForTestFunction公共静态void method01(){}
公共静态空的方法02(){}
@ AnnotationDefineForTestFunction公共静态void方法03(){
引发新的运行时异常(“方法03”);
}
公共静态空的方法04(){
引发新的运行时异常(“方法04”);
}
公共静态void main(String[] argv)引发异常{
(同Internationalorganizations)国际组织通过=0,失败=0;
//被检测的类名
string class name= com。bjinfotech。练习。注释。使用批注;
//逐个检查此类的方法,当其方法使用注释声明时调用此方法
对于(方法m : Class.forName(类名))。getMethods()) {
if(m . isannotationpresent(annotationdefinefortestfunction。class)){
尝试{
调用(空);
通过了;
} catch (Throwable ex) {
System.out.printf(测试%s失败:%s %n ,m,ex。get cause());
失败了;
}
}
}
System.out.printf(测试结果:通过:%d,失败:%d%n ,通过,失败);
}
}
3。使用第三方开发的注释类型
这也是开发人员所常常用到的一种方式。比如我们在使用休眠3.0时就可以利用注释生成数据表映射配置文件,而不必使用Xdoclet。
五、总结:
前面的文字说明了注释的使用方法、定义方式、分类。初学者可以通过以上的说明制作简单的注释程序,但是对于一些高级的
注释应用(例如使用自定义注释生成javabean映射可扩展标记语言文件)还需要进一步的研究和探讨。
2。同时,注释运行存在两种方式:运行时、编译时。上文中讨论的都是在运行时的注释应用,但在编译时的注释应用还没有涉及,因为编译时的注释要使用批注处理工具。
涉及以上2方面的深入内容,作者将在后文《Java Annotation高级应用》 中谈到。
六、参考资源:
矩阵-Java开发者社区:http://www.matrix.org.cn
http://爪哇。星期日com/docs/books/tutorial/Java/Java oo/annotations。超文本标记语言
http://爪哇。星期日com/J2SE/1。5 .0/docs/guide/apt/入门。超文本标记语言
http://爪哇。星期日com/J2SE/1。5 .0/docs/guide/apt/入门。超文本标记语言
http://爪哇。星期日com/J2SE/1。5 .0/docs/guide/apt/入门。超文本标记语言
作者的博客:http://博客。矩阵。org。cn/page/聪明的猪
转自:http://嗨。百度一下。com/全康/blog/item/3 e 69 ffead 8d 6 CCD 5d 539 c 998。超文本标记语言
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。