拼吾爱程序人生

首页 » 其他编程 » Java » 如何向Java注解添加行为
cobra - 2008-8-16 8:25:00
将常见可重用的行为以定制注解的方式添加到Java应用中是一种非常棒的方式,但如果开发者在决定使用注解的时候能够遵循一些开发标准和最佳实践的话,那就更事半功倍了。比如说在计划使用注释之前,比较一下当前情况下是不是注释真的比内迁代码和接口更为贴切。New Aspects的John Heintz在最近举行的No Fluff Just Stuff(NFJS)俄亥俄州软件中心研讨会(COSS)上作了一个演讲,讨论了向Java注解添加行为的多种设计技术。

讲中,John简要地谈到了字节码和元编程技术,大体介绍了Java应用中的元数据是如何在早期Java版本中使用属性文件、XML到现在逐渐发展到注解上来的过程。他也提到了制定JSR-175规范的目的在于为Java语言提供元数据工具,比如Java 5中就已经添加了注解。

定义注解与定义接口的方式相似(使用@Interface类型来声明注解)。注解不仅可以用在包级别上,也可以用在类成员(属性、方法、构造方法),甚至还可以用在方法的局部参数上。
保持策略(retention policy)是实现注解的重要一环,根据数据在内存中保持时间的长短,有三种类型的保持策略:


一些流行框架如EJB3HibernateSpringSeamStruts 2RIFEJAX-WS的新版本都开始支持注解。John论述了处理注解的三种方式:
生成器:
这种注解处理方式是通过读取源代码来产生新的源代码,或修改现存源代码及其它一些文件(XML、文档等等)来实现。生成器主要依赖于容器或其它编码约定,可以在任何保持策略下工作。

使用生成器的例子有注解处理工具(Annotation Processing Tool,即APT)和处理器、XDoclet、Spoon(针对Java的扩展编译器)、APT-Jelly(一个模板库)等。APT不允许你修改源代码,但对产生辅助文件却有相当大的帮助(像WSDL、文档)。

字节码转换:
注解处理器对带有注解的类文件进行解析,然后对类做一些设当的修改。此外,他们也能生成其他类型的文件(比如XML配置文件)。字节码转换器在离线状态(编译期)、在装载期都能运行,还能在运行时动态运行(使用JVMTI API)。在class或runtime这样的保持策略下,它都能运行。

使用字节码转换器的例子有AspectJ、Spring、Hibernate、CGLibJavassistASMBCEL等。

运行时反射:
这种方式使用反射API以编程的方式在运行阶段检查对象。它主要依赖于容器或其他编码约定,同时也需要runtime保持策略。

使用运行时反射的例子有:Java 5及更新Java版本中的反射、Commons Attributes。 像JUnitTestNG这样的测试框架也使用运行时反射来处理注解。

John采用一个Java示范应用向大家展示了如何结合APT、Javassist、AspectJ及反射(使用了Java动态代理)等多种设计技术来定制注解。他还展示了如何向类、属性和方法中添加行为,也谈到了如何使用Aspects来注解类型和方法。

此外,John还提到了Aspect Processing的好处,如容易实现(需要好工具的支持)、语义细致——可以影响到方法调用,甚至是属性的访问(在这点上,和反射和APT不同),还能够集成多个类库的注解,并支持特定的领域抽象。他建议开发人员说,如果Java代码可以以接口的方式实现,那就用接口,不要去用注解。他还建议大家不要对所有东西都使用注解,因为POJO(Plain Old Java Object)要比HAJO(Heavily Annotated Java Object)好。在演讲中,他列举了其它一些最佳实践准则,比如:


(文/Srini Penchikala  译/张龙 出处/Infoq)

 您可能对 [Java] 的这些文章也感兴趣:

使用Java Swing 创建一个XML编辑器
用 Java 保存位图文件
在JavaScript程序中整合Java函数
Java布局管理器深入讨论
Enterprise bean的开发
推技术聊天室的实现(下)
推技术聊天室的实现(上)
J2EE概述
从商业角度看J2EE与WINDOWS DNA
XML和J2EE的组合技术
简析J2EE应用程序数据库类设计模式
Java中的两个特殊变量this和super
1
查看完整版本: 如何向Java注解添加行为
Modify by pin5i DZNT_ExpandPackage 2.1.3296 2007-2009 pin5i.com
 Total Unique Visitors: