工具软件
办公软件
操作系统
网络安全
设计在线
程序开发
教程宝典
软件下载
软件论坛
您的位置:
软件
>
开发者网络
>
开发工具
>
Java
> 正文
体验Java 1.5中面向方面(AOP)编程
[文章信息]
作者:
陶刚编译
时间:
2004-12-24
出处:
天极网
责任编辑:
方舟
[文章导读]
在本文中我将考虑使用嵌入GUI应用程序中的状态条组件的情形
advertisement
热点推荐
·
禁止QQ登录的方法
·
给你的XML文件做个数字签名
·
ImageReady制作“焰火”小动画
·
Java加密和数字签名编程快速入门
·
在VB6中用命令行为模式控制GUI动作
[正文]
1
2
3
4
下一页
对于一个能够访问源代码的经验丰富的Java开发人员来说,任何程序都可以被看作是博物馆里透明的模型。类似线程转储(dump)、方法调用跟踪、断点、切面(profiling)统计表等工具可以让我们了解程序目前正在执行什么操作、刚才做了什么操作、未来将做什么操作。但是在产品环境中情况就没有那么明显了,这些工具一般是不能够使用的,或最多只能由受过训练的开发者使用。支持团队和最终用户也需要知道在某个时刻应用程序正在执行什么操作。
为了填补这个空缺,我们已经发明了一些简单的替代品,例如日志文件(典型情况下用于服务器处理)和状态条(用于GUI应用程序)。但是,由于这些工具只能捕捉和报告可用信息的一个很小的子集,并且通常必须把这些信息用容易理解的方式表现出来,所以程序员趋向于把它们明确地编写到应用程序中。而这些代码会缠绕着应用程序的业务逻辑,当开发者试图调试或了解核心功能的时候,他们必须"围绕这些代码工作",而且还要记得功能发生改变后更新这些代码。我们希望实现的真正功能是把状态报告集中在某个位置,把单个状态消息作为元数据(metadata)来管理。
在本文中我将考虑使用嵌入GUI应用程序中的状态条组件的情形。我将介绍多种实现这种状态报告的不同方法,从传统的硬编码习惯开始。随后我会介绍Java 1.5的大量新特性,包括注解(annotation)和运行时字节码重构(instrumentation)。
状态管理器(StatusManager)
我的主要目标是建立一个可以嵌入GUI应用程序的JStatusBar Swing组件。图1显示了一个简单的Jframe中状态条的样式。
图1.我们动态生成的状态条
由于我不希望直接在业务逻辑中引用任何GUI组件,我将建立一个StatusManager(状态管理器)来充当状态更新的入口点。实际的通知会被委托给StatusState对象,因此以后可以扩展它以支持多个并发的线程。图2显示了这种安排。
图2. StatusManager和JstatusBar
现在我必须编写代码调用StatusManager的方法来报告应用程序的进程。典型情况下,这些方法调用都分散地贯穿于try-finally代码块中,通常每个方法一个调用。
public void connectToDB (String url) {
StatusManager.push("Connecting to database");
try {
...
} finally {
StatusManager.pop();
}
}
这些代码实现了我们所需要功能,但是在代码库中数十次、甚至于数百次地复制这些代码之后,它看起来就有些混乱了。此外,如果我们希望用一些其它的方式访问这些消息该怎么办呢?在本文的后面部分中,我将定义一个用户友好的异常处理程序,它共享了相同的消息。问题是我把状态消息隐藏在方法的实现之中了,而没有把消息放在消息所属的接口中。
面向属性编程
我真正想实现的操作是把对StatusManager的引用都放到代码外面的某个地方,并简单地用我们的消息标记这个方法。接着我可以使用代码生成(code-generation)或运行时反省(introspection)来执行真正的工作。XDoclet项目把这种方法归纳为面向属性编程(Attribute-Oriented Programming),它还提供了一个框架组件,可以把自定义的类似Javadoc的标记转换到源代码之中。
但是,JSR-175包含了这样的内容,Java 1.5为了包含真实代码中的这些属性提供了一种结构化程度更高的格式。这些属性被称为"注解(annotations)",我们可以使用它们为类、方法、字段或变量定义提供元数据。它们必须被显式声明,并提供一组可以包含任意常量值(包括原语、字符串、枚举和类)的名称-值对(name-value pair)。
注解
(Annotations)
为了处理状态消息,我希望定义一个包含字符串值的新注解。注解的定义非常类似接口的定义,但是它用@interface关键字代替了interface,并且只支持方法(尽管它们的功能更像字段):
public @interface Status {
String value();
}
与接口类似,我把@interface放入一个叫做Status.java的文件中,并把它导入到任何需要引用它的文件中。
对我们的字段来说,value可能是个奇怪的名称。类似message的名称可能更适合;但是,value对于Java来说具有特殊的意义。它允许我们使用@Status("...")代替@Status(value="...")来定义注解,这明显更加简捷。
我现在可以使用下面的代码定义自己的方法:
@Status("Connecting to database")
public void connectToDB (String url) {
...
}
请注意,我们在编译这段代码的时候必须使用-source 1.5选项。如果你使用Ant而不是直接使用javac命令行建立应用程序,那么你需要使用Ant 1.6.1以上版本。
作为类、方法、字段和变量的补充,注解也可以用于为其它的注解提供元数据。特别地,Java引入了少量注解,你可以使用这些注解来定制你自己的注解的工作方式。我们用下面的代码重新定义自己的注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Status {
String value();
}
@Target注解定义了@Status注解可以引用什么内容。理想情况下,我希望标记大块的代码,但是它的选项只有方法、字段、类、本地变量、参数和其它注解。我只对代码感兴趣,因此我选择了METHOD(方法)。
@Retention注解允许我们指定Java什么时候可以自主地抛弃消息。它可能是SOURCE(在编译时抛弃)、CLASS(在类载入时抛弃)或RUNTIME(不抛弃)。我们先选择SOURCE,但是在本文后部我们会更新它。
1
2
3
4
下一页
天极社区
邀请您:
写博客日记
上传相片
论坛聊天
订阅电子杂志
推荐网摘
免费图铃工具
笔名:
请您注意:
遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。
天极网拥有管理笔名和留言的一切权利。
评论:
发表评论
推荐给朋友
我想参加相关培训
打印
我对此感兴趣
订阅电子杂志
相关内容
焦点新闻
关于EJB的持久化对象技术分析
2004开发技术年度综述之Java世界
Java中实现基于Aspectwerkz的AOP开发
在JBoss中配置多个数据库和数据源
Eclipse 3.0 简介和插件开发示例
民营家电商排队造手机 设备商全面杀入
英特尔澄清杨旭任职传闻 官方没宣布此消息
国资委河北密制联通拆分方案
垃圾邮件害人害企害国 清除垃圾邮件不手软
中兴携手阿尔卡特 全球逐鹿CDMA
用友总裁王文京:誓将ERP变成“大众消费”
香港消费者委员会:数码相机最贵未必最好
外电称中兴正评估西门子手机业务 或能并购
Advertisement
天极无线
名人漫画
奇妙科幻|
美好风光|
清风车影|
漫画卡通|
星座生肖|
明星写真|
动物世界
老鼠爱大米
挥着翅膀的女孩
女人味
栀子花开
白月光
刚刚好
江南
快乐崇拜
亲爱的你怎么不在我身边
小薇
2002年的第一场雪
有多少爱可以重来
我的地盘
七里香
情人
老鼠爱大米
老板电话
冲动的惩罚
七里香
我不是黄蓉
女生撒娇
盛夏的果实
坚持到底
孤单北半球
眉飞色舞
挪威的森林
可爱女人
最浪漫的事
老板电话
CSEEK搜索
CPU
笔记本
内 存
台式机
主 板
掌上电脑
显 卡
MP3
硬 盘
数码相机
CRT显示器
投影机
液晶显示器
喷墨打印机
交换机
激光打印机
路由器
服务器