(计算机应用技术专业论文)基于ioc和aop的轻量级框架研究.pdf_第1页
(计算机应用技术专业论文)基于ioc和aop的轻量级框架研究.pdf_第2页
(计算机应用技术专业论文)基于ioc和aop的轻量级框架研究.pdf_第3页
(计算机应用技术专业论文)基于ioc和aop的轻量级框架研究.pdf_第4页
(计算机应用技术专业论文)基于ioc和aop的轻量级框架研究.pdf_第5页
已阅读5页,还剩49页未读 继续免费阅读

(计算机应用技术专业论文)基于ioc和aop的轻量级框架研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中文摘要 经过j a v a 八年的发展,在传统j 2 e e 开发领域,e j b 框架逐渐褪去其头上的 光环,显示出越来越多的弊端,此时轻量级框架应运而生,s p r i n g 框架就是其中 的佼佼者,它优雅的提供企业级应用需要的各种基础设施,其强大功能就建立在 它的核心机制4 0 c 和a o p 的基础之上。 本文研究s p r i n g 框架中i o c 和a o p 的实现和应用,主要做了以下几个方面 的工作。首先,对比研究当前的各种框架技术,分析s p r i n g 框架的利弊,指出 s p r i n g 框架得以广泛应用的原因。然后,研究在j a v a 语言层面上与框架紧密相 关的一些高级特性,如类加载器、反射、动态代理、j a v a b e a n 技术等,这些技术 普遍适用于通用基础设施的编写,它们是s p r i n g 框架的基础。在参考大量文献 的基础上,本文深入s p r i n g 框架内部,研究它的设计思路,分析框架层层封装 下的i o c 和a o p 实现,以u m l 中类图和顺序图的形式表现出来。最后,在天 津市保安信息管理系统项目中,对s p r i n g 框架进行有效的扩展,基于其i o c 和 a o p 实现开发出一个具有广泛适用性的框架,使之更适用于某些特定领域的w e b 应用。 当前s p r i n g 框架在工程应用领域已经有许多成功事例,但在基础设施方面 的应用尚显单薄。本文分析框架核心机制i o c 和a o p 的实现,这在各大企业基 础平台研究方面具有一定的借鉴价值。本文以s p r i n g 框架为基础的扩展强调了 s p r i n g 框架在基础设施开发方面的作用,指出无需重新实现i o c 和a o p 容器, s p r i n g 框架提供的i o c 和a o p 实现能够很好的满足需求,这对目前i o c 和a o p 的应用研究有一定程度上的创新意义。 关键词:轻量级框架依赖注入面向方面编程 a b s t r a c t a f t e re i g h ty e a r sd e v e l o p m e n ta n da p p l i c a t i o n , t h ee j bf r a m e w o r kh a ss h o w ni t s d i s a d v a n t a g e sd a yb yd a y m e a n t i m e ,m a n yk i n d so fl i g h tf r a m e w o r k sc o m ef o r t h a l o n gw i t ht h el o ca n da o pt e c h r t l q u e s e m e r g e n c e t h es p r m gf r a m e w o r ks e e i n s o n e o f t h e b e s ta m o n g t h e m , w h o s ec o r e i s t h e m e c h a n i s m o f l o c a n d a o p p r e v i o u s l y , a u t h o rh a sm a d e t h ed e v e l o p m e n to ft h es e c u r i t yg u a r di n f o r m a t i o n m a n a g e m e n ts y s t e mo ft i a l l j i np u b l i cb u r e a uu s i n gs p r i n gf r a m e w o r k , a n dt h i s a r t i c l eh o p et om a k eaf u g t h e rr e s e a r c ho ni t t h i sp a p e rs t a r t sw i t ht h ec o m p a r i s o n s a n da n a l y s e so fs o m ec u r r e n tf r a m e w o r k s ,l a y i n gt of i n do u tt h ea d v a n t a g e sa n d d i s a d v a n t a g e so ft h es p r i n gf i a m e w o r k a n dt h e n , i tr e s e a r c hs o m ea d v a n c e dj a v a t e c h n i q u e sr e l a t e dt os p r i n gf r a l _ i l e w o r k , s u c ha sc l a s sl o a d e r , r e f l e c t , d y n a m i cp r o x y , j a v a b e a na n ds oo n , w h i c hc o n s t r u c t st h ef o u n d a t i o no fs p r i n gf r a m e w o r k t h i r d l y , t h i s a r t i c l er e s e a r c hs p r i n gf r a m e w o r k ss o u r c ec o d e ,a n a l y z et h er e a l i z a t i o no fl o c a n da o pa n ds h o wi t ss t r u c t u r ea n dp r o c e s si nd e t a i lb yt h ec l a s sd i a g r a m sa n d s e q u e n c ed i a g r a m si nu m l a tl a s t , t h i sa r t i c l et r yt oe x t e n dt h es p r i n gf i a m e w o r kt o f rt h en e e do fa ne v e r - p r o b l e mi nw e b a p p l i c a t i o n , t h a ti s ,t os h o wt h ed a t a b a s et a b l e s i n t h es a m e w a y t h ep a p e ra n a l y z e st h er e a l i z a t i o no fi o c a n da o pi ns p r i n gf r a r l l e w o r k ,w h i c hi s v a l u a b l ef o rt h ee n t e r p r i s ef o u n d a t i o np l a t f o r ma p p l i c a t i o n i ta l s oe m p h a s i z e ss p r i n g f l a m e sv a l u ei nf o u n d a t i o na p p l i c a t i o nb ya ne x a m p l eo f e x t e n d i n gs p r i n gf r a m e w o r k , w h i c ht os o m ee x t e n di n n o v a t e dt h ei o ca n da o p a p p l i c a t i o n k e y w o r d s :l i g h tf r a m e w o r k , l o c ,a o p 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作和取得的 研究成果,除了文中特别加以标注和致谢之处外,论文中不包含其他人已经发表 或撰写过的研究成果,也不包含为获得苤茎盘茔或其他教育机构的学位或证 书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中 作了明确的说明并表示了谢意。 姗繇落青撕期:州年夕日 学位论文版权使用授权书 本学位论文作者完全了解鑫鲞盘鲎有关保留、使用学位论文的规定。 特授权鲞鲞盘生可以将学位论文的全部或部分内容编入有关数据库进行检 索,并采用影印、缩印或扫描等复制手段保存、汇编以供查阅和借阅。同意学校 向国家有关部门或机构送交论文的复印件和磁盘。 ( 保密的学位论文在解密后适用本授权说明) 学位论文作者签名: 蓠弓 导师躲叭吾衰 导师签名:吖弋_ 孑 设 签字日期:护( 年j 月,日签字日期:妒,5 年月ly 日 第一章绪论 1 1 本文的研究背景 第一章绪论 在传统的j 2 e e 应用中,e j b ( e n t e r p r i s ej a v a b e a n ) 一直作为j 2 e e 的核心存 在。然而,产生于1 9 9 8 年e j b1 0 ,是在j a v a 语言发生巨大变化的j 2 s e1 2 发 布之前提出的,现在e j b2 x 的整体架构是和e j b1 0 一脉相承,过去八年的开 发经验逐渐褪去了它的光环。随着j a v a 语言的发展,a o p ( a s p e c to r i e n t e d p r o g r a m m i n g ) 、i o c ( i n v e r s i o no fc o n t r 0 1 ) 等技术逐渐成熟,一种新的j 2 e e 解 决方案应运而生,即轻量级框架。 s p d n g 框架以其优美的架构和成熟的外设成为轻量级框架中最出色的代表, 它以优雅的方式提供j 2 e e 开发所需要的各种基础设施,采用p o j o p o j i ( p l a i n o r d i n a r y j a v ao b j e c t p l a i no r d i n a r y j a v ai n t e r f a c e ) ,“照单点菜”式的提供诸如事务 处理、持久性、安全性等服务。而s 面n g 框架如此轻巧灵活的机制就建立在其 微核心l o c 容器的基础之上,同时各种服务以a o p 方式提供。 1 2 本文主要工作及创新点 本文深入研究s p r i n g 框架i o c 和a o p 的原理、实现和应用,是对本人硕士 其间所作工作的高度总结。首先,本文对比研究当前的各种框架技术,分析s p r i n g 框架的利弊,指出s p r m g 框架得以广泛应用的原因。然后,本文研究了与框架 相关的j a v a 语言层面上的一些高级特性,如类加载器、反射、动态代理、j a v a b e a n 技术等,这些技术普遍适用于通用基础设施的编写,它们构成了s p r i n g 框架的 基石。进而在参考大量文献的基础上,研读s p r i n g 框架源码,分析其设计思路 和层层封装下的i o c 和a o p 的实现,以u m l 中类图和顺序图的形式表现出来。 最后,本文在天津市保安信息管理系统中,针对w e b 应用开发中一些常见问题 对s p r i n g 框架进行扩展,基于其i o c 和a o p 实现开发出广泛适用的框架,有效 地降低了s p r i n g 框架的使用复杂度,提高开发效率,缩短开发周期,显示s p r i n g 框架在通用型基础设施应用方面的强大能力。 当前s p r i n g 框架在工程应用领域被大量使用,实践已经证实s p r i n g 框架是 第一章绪论 一个成熟、健壮的系统,但在基础设施方面的应用尚显单薄。本文分析其核心i o c 和a o p 的实现,这在各大企业基础平台研究方面具有一定的参考价值,本文以 s p r i n g 框架为基础的扩展强调了s p r i n g 框架在基础设施开发方面的作用,指出无 需重新实现l o c 和a o p 容器,s p r i n g 框架提供的i o c 和a o p 实现能很好的满足 需求,这在目前l o c 和a o p 的应用研究领域有一定的创新意义。 1 3 本文结构 本文分为七部分。第一部分为绪论,概括介绍了课题的相关背景,研究的意 义以及所作的主要工作。第二部分对各种框架进行横向和纵向的对比,说明 s p r i n g 框架的优势和不足。第三部分深入研究s p r i n g 框架实现的底层技术原理, 包括类加载器、反射、动态代理、c g l i b 代理、通用j a v a b e a n 操作、设计模式 等,这些技术是实现通用基础设施的语言基础。第四部分研究了s p r i n g 框架的 核心i o c 容器,在参考大量文献的基础上深入分析s p r i n g 框架i o c 包的源码,以 u m l 类图、顺序图的形式详细描述其层层封装下的l o c 实现。第五部分对s p r i n g 框架中的另一个核心概念a o p 的实现进行了深入研究,同样以u m l 类图、顺 序图的形式描述其极具升缩性的封装层次和优雅的实现,进而研究了a o p 实现 集成到l o c 容器中的过程。第六部分在天津市保安信息管理系统中,基于s p r i n g 框架的i o c 和a o p 机制对其进行扩展,降低使用复杂度,缩短开发周期,使之 更适用于某些w e b 应用的快速开发。论文的最后部分对以上工作做了分析、总 结和展望。 1 4 本文的研究意义 当前 o c 和a o p 被普遍认为是一个优秀基础框架应该具有的两大特征,但 是不同框架的i o c 和a o p 实现仍十分混乱,有待进一步研究。本文研究的主要 意义在于: 1 、s p r i n g 框架的i o c 和a o p 实现经实践证明已经非常成熟、完善,所以其 实现对重新开发或定制满足特定需要的i o c 和a o p 实现有很高的参考价值。本 文对s p r i n g 框架i o c 和a o p 实现的研究对搭建个性化的企业基础平台具有一定 的参考价值。 2 、本文提出以s p r i n g 框架的i o c 和a o p 实现为基础开发满足特定需要的 2 第一章绪论 基础设施,利用s p r i n g 现有i o c 和a o p 实现,对其进行扩展,开发出适用于某 些特定领域的应用框架,可以降低开发成本,提高开发周期,同时获得s p r i n g 框架具有的被广泛证明的健壮性。本文在天津市保安信息管理系统中对s p r i n g 框架做了有效扩展,在这方面做出了积极的尝试。 第二章企业级应用开发中的框架技术 第二章企业级应用开发中的框架技术 2 1 轻量级框架概念 轻量级框架的概念主要相对于传统的e j b 框架,其“轻量”也是相对于目| b 框架的笨重复杂和低下的性能而言的,相对于轻量级框架,f d b 架构又被称之为 重量级框架。 轻量主要是指两个方面:简化的编程模型和更具响应能力的容器,旨在消除 与传统j 2 e e a p i 有关的不必要的复杂性和限制,缩短应用程序的部署时间,从 而提高生产率,达到这一目的手段就是轻量级框架采用的i o c 和a o p 技术。 2 2 轻量级框架的产生背景 e n t e r p r i s ej a v a b e a n s 技术自1 9 9 8 年3 月问世,一直作为j 2 e e 的核心存在, 用于简化企业应用的开发,让开发人员能够将注意力集中于问题领域,而无需关 注系统级的问题。在之后的八年间,e j b 架构在企业级应用中发挥了巨大的作用, 然而大量工程实践证明e j b 架构存在许多不足,随着j a v a 技术的发展,e j b 提 供的大多数服务可以用新技术更优雅的解决。 在j 2 e e 社区中一股重要力量当属开源社区,本着对技术的爱好和对完美的 追求,在j 2 e e 领域的各个层面上,几乎所有的主流产品都有来自开源项目的替 代方案,其中很多开源产品胜过商业产品。对f _ d b 框架的不满,开源社区中产 生了轻量级框架,其思想最初出现于r i c h a r d o b e r g 的动态代理r m i 设计与j b o $ s 服务器的微内核中,经过两三年的发展,形成了轻量级框架的完整解决方案,并 显示其完全取代传统e j b 框架的实力。 2 3 轻量级框架与重量级框架的比较 e j b 架构是一种基于组件模型的系统架构,具有很强的侵略性,业务组件必 须具有e y b 的接口声明,组件在接口和实现中都显式依赖于框架,不能脱离框 4 第二章企业级应用开发中的框架技术 架存在。e j b 提供了企业级应用的所有基础服务,包括对事务处理、持久性、安 全性、组件生命周期管理和资源管理、并发访问管理、寻址服务、远程机制以及 集群机制的内置支持,但是其中的一些服务的实现存在缺陷,在应对特定业务场 景的时候往往捉襟见肘,另一方面,e j b 所有服务都必须强制提供,即使系统只 使用到了其中的少数几个服务,也必须付出运行所有服务的代价。 轻量级框架是传统组件编程和普通对象编程的混合体,广泛采用i o c 依赖注 入机制,业务对象不存在框架的依赖。轻量级框架同样提供重量级框架所能提供 的各种企业级基础服务,并且针对e i b 架构的两大弊端,即强制提供所有服务 和组建接口具有很强的侵略性,做出彻底的变革,实现透明的、照单点菜式的服 务提供方式,可以按需配置需要的服务。 不同的基础架构带来性能上的不同,轻量级框架的代表s p r i n g 几乎在各种 服务性能上都要比本地e j b 更好,同时基于i o c 架构带来了更高的开发效率和 代码可测性。 2 4 轻量级框架间比较 目前主要有三种流行的基于i o c 的轻量级框架:s p r i n g 、h i v e m i n d 、 p i e o c o n t a i n e r 。s p r i n g 框架具有功能齐全的i o c 容器、面向方面编程( a o p ) 模 型和企业开发所需的各种集成组件。h i v e m i n d 出自j a k a r t a t a p e s t r y 的创建者之 手,它允许您为b e a n 或比较大的组件( 模块) 执行依赖注入。p i c o c o n t a i n e r 是 最小的轻量级容器,只支持j a v a 技术风格配置,而不支持x m l 配置。 s p r i n g 支持三种依赖注入:$ e t t 盯、构造函数和方法注入,通常采用s e t t e r 注 入。s p r i n g 的x m l 风格配置更重视灵活性。s p r i n g 易于插入任何系统。s p r i n g 框架是三种容器实现中最完美的,有着丰富的文档。s p r i n g 具有依赖自动注入方 式。s p r i n g 提供了完整的a o p 框架,使得更容易附加服务。可以使用s p r i n g 自己的框架或集成a s p e e t j 。 这三种容器都接受p o j o 对象,都可以管理对象生命周期,都执行依赖注 入。尽管植入每种容器的代码可能相似,但容器本身反映了不同的能力、风格。 2 5s p r i n g 框架 s p r i n g 是一个一站式的解决方案,提供了一个典型应用所需要的大部分基础 第二章企业级应用开发中的框架技术 架构。其所关注的领域是其他许多流行的f r a m e w o r k 未曾关注的,它要提供的是 一种管理你的业务对象的方法。s p r i n g 有分层的体系结构,既是全面的又是模块 化的,开发者可以选择仅仅使用它任何一个独立的部分,而它的架构又是内部一 致。s p r i n g 使得工程不依赖于框架。s p r i n g 的目标就是让已有的技术更加易用, 而不重新制作轮子,比如日志、连接池、0 瓜映射、分布式事务调度等均由开源 项目提供或应用程序服务器提供,框架只提供了一个抽象层覆盖其他技术。 2 5 1s p r i n g 框架概貌 s p r i n g 整体框架由c o r e 包、a o p 包、d a o 包、o r m 包、w e b 包、c o n t e x t 包、w e bm v c 包组成。c o r e 包使整个框架的基础,提供了依赖注入机制,其它 包建立在此微内核之上,通过i o c 机制灵活的装卸。a o p 包贯穿其它包,提供 面向切面拦截能力,提供相关服务。整个s p r i n g 框架以i o c 为基础,a o p 贯穿 始终。 2 5 2s p r i n g 框架利弊 图2 - 1s p r i n g 框架总体结构 s p r i n g 能有效地组织你的中间层对象,能消除在许多工程中常见的对 s i n g l e t o n 的过多使用,能消除各种各样自定义格式的属性文件的需要,用一种在 不同应用程序和项目问一致的方法来处理配置文件,s p r i n g 应用中的大多数业务 对象没有依赖于s w i n g 框架,使用s p r i n g 构建的应用程序易于单元测试,s p r i n g 能使e j b 的使用成为一个实现选择,而不是应用架构的必然选择,用户能选择用 6 习习 第二章企业级应用开发中的框架技术 p o j o s 或l o c a le j b $ 来实现业务接口,却不会影响调用代码。s p r i n g 能提供一种 e j b 的替换物,适用于许多w e b 应用,例如,s p r i n g 能使用a o p 提供声明性事 务管理而不通过e j b 容器,s p r i n g 为数据存取提供了一个一致的框架,不论是使 用的是j d b c 还是o rm a p p i n g 产品( 如h i b e r n a t e ) 。 第三章轻量级框架技术原理 3 1 类加载器 第三章轻量级框架技术原理 j a v a 的类加载器( c l a s sl o a d e r ) 体系结构提供一种在运行时动态、灵活地 定位资源( 代码和数据) 的方式。类加载器允许在运行时利用多种不同的资源创 建应用程序,并提供命名空间机制,是同一资源的多个版本在单个虚拟机上共存。 类加载器还可以与安全体系结构集成,控制虚拟机在何处以何种方式加载类。 3 1 1 类加载器在整个j a v a 体系结构中的角色 类加载器不光要负责加载而且要负责连接和初始化应用程序需要用到的 j a v a 类型。加载就是把二进制形式的字节码读入虚拟机中,而连接就是给这个已 经读入的类型分配类变量内存以及把类型中用到常量池中的符号转换为直接引 用,最后的初始化过程就是赋给类型变量合适的初始值。 客户 文件 j j v m j : ! 序 母 j 鲫 _ cj a : 阜 底层操作系统 a p i 文件 图3 1 类加载器在j a v a 体系结构中的作用 8 第三章轻量级框架技术原理 3 1 2 类与数据 一个类代表要执行的代码,而数据则表示其相关状态。状态时常改变,而代 码则不会。将一个特定的状态与个类对应起来,这就意味着将一个类实例化。 尽管相同的类对应的实例状态千差万别,但本质都对应着同一段代码。在j a v a 中,一个类通常有着一个c l a s s 文件。在j a v a 的运行时环境中( j a v ar u n t i m e ) , 每一个类都有一个以第一类( f i r s t - c l a s s ) 的j a v a 对象所表现出现的代码,它就是 j a v & l a n g c l a s s 的实例。 一旦一个类被载入m 中,同一个类( c l a s s 实例而不是c l a s s 代表的对象) 就不会被再次载入了。正如一个对象有一个具体的状态,一个对象始终和其代码 ( c l 髂s 类) 相关联。同理,载入m 的类也有一个具体的标识,在虚拟机种表明 这是“同一个类”。 在j a v a 中,一个类用其完全匹配类名作为标识,完全匹配类名包括包名和 类名。但在j v i v l 中一个类用其全名和一个加载类c l a s s l o a d e r 的实例作为唯一标 识。因此,如果一个名为p g 的包中,有一个名为c l 的类,被类加载器c l a s s l o a d e r 的一个实例k l l 加载,c l 的实例,即c 1 c l a s s 在t v m 中表示为( c 1 ,p g ,p a l ) 。这 意味着两个类加载器的实例( c l ,p g ,k 1 1 ) 和( c l ,p g , v a 2 ) 是不同的,被它们所加载 的类也因此完全不同,互不兼容的。 3 1 3 显式类加载 在m 中,每一个类都被j a v a 1 a n g c l a s s l o a d c r 的一些实例来加载通过调 用l o a d c l a s s 方法,传入类的完整名称,获得表示所加载类的可区别c l a s s 对象, 如果类加载器出现故障,则抛出c l a s s n o t f o u n d e x c e p t i o n 异常。g ) k 中c l a s s l o a d e r 类部分代码如下: p a c k a g ej a v a 1 a n g p u b l i cc l a s sc l a s s l o a d c r p u b l i cc l a s sl o a d c l a s s ( s 埘n ge l a s s n a m e ) t h r o w sc l a s s n o t f o u n d e x c c p t i o n ; | | , j a v a 1 a n g t h r e a d ,包含了p u b l i cc l a s s l o a d e rg e t c o n t e x t c l a s s l o a d e r 0 方法,这 一方法返回针对一具体线程的上下文环境类加载器。此类加载器由线程的创建者 提供,以供此线程中运行的代码在需要加载类或资源时使用。如果此加载器未被 建立,缺省是其父线程的上下文类加载器。原始的类加载器一般由读取应用程序 第三章轻量级框架技术原理 的类加载器建立。 3 1 4 隐式类加载 各个j a v a 类保留一个对加载该类的类加载器的引用,可通过g e t c l a s s l o a d e r 0 方法访问。当一个类引用另一个类时,则使用加载引用类的同一个类加载器隐式 加载引用。 3 1 5 类加载器规则 隐式类加载使程序简单,显式类加载使程序灵活。同时,这些机制提供一些 附加属性,来处理类可见性问题,控制不同类加载器加载的类之间的通信。类加 载器体系结构包含一致性规则、委托规则、可见性规则。 一致性规则:类加载器不能多次加载同一个类,一旦已加载了类,以后从同 一个类加载器加载相同类时必须返回已加载的类。此规则的实现是采用在类加载 器中保留已加载类的h a s h m a p 或其他数据结构,并在试图再次加载类前查询该 结构来实现。 委托规则:类加载器总在加载类前询问父类加载器。c l a s s l o a d e r 的构造函 数使用单个参数,类型仍为c l a s s l o a d e r ,是新类加载器的父类。类加载器及其 所有父类加载器的集合称为一个委托链( d e l e g a t i o n ) ,在特定类加载器加载类前, 将递归检查其所处委托链位置之前的所有类加载。 可见性规则:可见性规则规定,类只能看到其类加载器的委托加载的其他类, 这是j a v a 砂箱安全机制的基础。 3 2 反射机制 3 2 1 二进制类元数据 j a v a 二进制类即c l a s s 字节码文件不仅包含许多可执行指令,还包含大量元 数据。所谓元数据,即描述二进制类结构的数据。j a v a 类二进制数据中包含类、 字段、字段类型、方法和方法参数类型的字符串名。图3 2 显示了可遍历的二进 制类格式相关数据结构。 1 0 第三章轻量级框架技术原理 图3 - 2 二进制类格式的元数据 父类和接口引用包含到常量池的索引,可上溯到类的基类和超类接口的实际 字符串名。字段和方法组也包含到常量池的索引,同样,这些常量池可关联到引 用类型的实际字符串名,以及方法和字段的字符串名,方法还包含对实现方法的 j a v a 字节码的引用,当这些字节码引用另一个类时,则通过解析被引用类字符串 名的常量池索引来完成。在整个虚拟机中,类型通过其完整的、以包名为修饰符 的字符串名引用,字段和方法也通过其字符串名引用。 3 2 2 反射 在很多给予指针的编程语言中,编译时对名称和类型的假设可能在运行时出 错,j a v a 反射是对这些语言的改进。由于可以使用类元数据,代码的动态链接更 可靠。 二进制类文件中的大多数元数据通过反射a p i 以编程方式表现。反射及包含 发现功能,也含调用功能,动态显示j a v a 类的特性:基类、超接口、方法、字 段、字段类型等等,实例化对象,调用方法以及转换字段。利用这些特性,反射 调用可用来编写通用对象服务,可在运行时适应所发现的类型,尤其适合编写“胶 水”代码,即位于不同类、包和子系统边界的代码。 3 2 3 反射字段 查找字段是反射的一种用法。字段由j a v a 1 0 n g r e f l e c t f i e l d 类表示,f i e l d 类 包含字段的初始源代码声明的所有信息:字段名、类型和修饰符。c l a s s 类提供 第三章轻量级框架技术原理 了几种方法来检索类字段。 f i e l d 类的类型信息: p a c k a g e j a v a 1 a n g r e f l e c t ; p u b h cc l a s sf i e l d p u b l i cs t r i n gg e t n a m e 0 ; p u b l i ci mg e t m o d i f i e r s o ; p u b l i cc l a s sg e t t y p e 0 ; | | ) 访问字段的c l a s s 方法: p a c k a g ej a v a 1 a n g ; p u b l i cc l a s sc l a s s p u b l i cf i e l d g e t d e e l a r e d f i e l d s 0 ; p u b l i cf i e l d g e t f i e l d s o ; p u b l i cf i e l dg e t d e c l a r e d f i e l d ( s t r i n gb a l t i c ) t h r o w sn o s u e h f i e l d e x c e p t i o n ; p u b l i cf i e l dg e t f i e l d ( s t r i n gn a m e ) t h r o w sn o s u c h f i e l d e x e e p t i o n ; l l ) 3 2 4 反射方法 通过反射访问方法类似于反射字段。方法由j a v a 1 a n g r e f l e c t m e t h o d 类表示, 该类保存原始j a v a 源代码文件的方法签名信息。获得m e t h o d 对象比获得f i e l d 对象稍微复杂些,因为m e t h o d 方法名可以重载。除参数类型外,m e t h o d 类还允 许访问方法的返回类型和抛出的已检测异常。 以下是1 d k 中方法和构造函数的类型信息: j a v & l a n g r e f l e c t m e t h o d 和j a v a 1 a n g r e f l e c t c o n s t r u c t o r 类共同包含如下方法 p u b l i cs t r i n gg e t n a m e o ; p u b l i ci n tg e t m o d i f i e r s 0 ; p u b l i cc l a s sg e t r e t u r n t y p e 0 ; p u b l i cc l a s s dg e t p a r a m e t e r t y p e s 0 ; p u b l i cc l a s s og e t e x c e p t i o n t y p e s o ; 以下是j d k 中用于访问方法和构造函数的类方法 p u b l i cm e t h o dg e t d e e l a r e d m e t h o d ( s t r i n gn a m e ,c l a s s 0p a r a m e t e r t y p e s ) ; p u b l i cm e t h o dg e t m e t h o d ( s t r i n gn a l l l e ,c l a s s op a r a r a e t e r t y p e s ) ; 1 2 第三章轻量级框架技术原理 p u b l i cm e t h o d g e t d e c l a r e d m e t h o d s 0 ; p u b l i cm e t h o d g e t m c t h o d s o ; p u b l i cc o n s t r u c t o rg e t d e c l a r e d c o n s t r u c t o r ( c l a s s 口p a r a m e t e r t y p e s ) ; p u b l i cc o n s t r u c t o rg e t m e t h o d ( c l a s s p a r a m e t e r t y p e s ) ; p u b l i cc o n s t r u c t o r dg e t d e c l a r e d c o n s t n m t o r s 0 ; p u b l i cc o n s t r u c t o r 0g e t c o 】蓝仃u c t o r s o ; 3 2 5 反射调用 反射不仅能够获得类的字段、方法和构造函数,更重要的能力体现在反射调 用上。通过反射调用,可访问或者更改字段的值,调用类方法。 反射调用通过使用f i e l d 、m e t h o d 和c o n s t r u c t o r 类在运行时获得和改变对象 的状态,由于这些类不包含对被调用类的隐式t h i s 引用,所以必须显式将t h i s 引 用指定为参数。反射调用不可预知参数类型和返回值类型,所以参数和返回类型 总是o b j e c t 类型。反射调用不可预知方法要抛出的具体异常,所以捕获所有异 常。下面为j d k 中关键的反射调用a p i 。 a v a 1 a n g r e f l e c t f i e l d 对象字段的获取和修改 p u b l i co b j e c tg 皈o b j e c tt h i s ) ; p u b l i cv o i ds e t ( o b j e c tt h i s ,o b j e c tv a l u e ) ; j a v & l a n g r e f l e c t m e t h o d 对象方法的调用 p u b l i co b j e c ti n v o k e ( o b j e c tt h i s ,o b j e c t a r g o t h r o w si n v o c a t i o n t a r g e t e x c e p t i o n ; a v a 1 a n g r e f l e c t c o n s t r u c t o r 对象构造函数的调用 p u b l i c0 b j e c tn e w i n s t a n c e ( o b j e c t da r g s ) t h r o w si n s t a n t i a t i o n e x c e p t i o n , i n v o c a t i o n t a r g e t e x c e p t i o n ; 3 3 动态代理机制 动态代理在j d k l 3 版之后出现,它与反射调用正好相反。在使用反射调用 时,客户程序使用通用a p i 调用在编译时并不了解的方法。而在使用动态代理时, 服务程序使用通用a p i 实现服务类上的方法,在运行时生成,目的是满足客户程 序的要求。动态代理灵活多变,与反射调用相结合,动态代理可以实现通用拦截 器( g e n e r i ci n t e r c e p t o r s ) 。拦截器是一段位于客户程序和服务程序之间的代码片 断,用于添加附加服务,如事物、安全检查或参数验证等。动态代理一般用于不 第三章轻量级框架技术原理 依赖具体接口和方法的通用服务: - 参数验证和修改,不论参数出现在什么位置,都要进行分析; 安全检查; 方法调用的跟踪或调试; - 隐式或上下文参数的传递。 3 3 1 继承、委托和动态代理 给一个类增加某些服务,在传统的面向对象方式下有两种实现方式:继承和 委托。由于j a v a 中不存在多重继承,一般情况下如果通过继承实现服务,每增 加一个服务,需要的具体子类数目将加倍。 图3 3 实现继承导致类的增生 在使用委托时,每个服务只增加一个类,类被连接到一起,来提供需要的服 务组合。 图3 - 4 通过委托实现服务时需要的类 图3 5 在使用委托时,每个服务只需要一个类 1 4 第三章轻量级框架技术原理 动态代理与手工委托相比,具有两方面的优势。首先,不必编写动态代理。 其次,可在运行时生成,每当出现新接口时就进行处理。 3 3 2 动态代理关键a p i 要生成动态代理,只需要调用p r o x y n e w p r o x y i m t a n c e ,传入 i n v o c a t i o n h a n d l e r 接口的实现。如下总结了这些a p i 。n e w p r o x y i n s t a n c e 方法在 内存中生成新的二进制类。这个特殊类将指定接口中的方法转发到 i n v o c a f i o n h a n d l e r 实例。然后指定的类加载器将新类加载到虚拟机,并由此生成 代理实例。 代理和i n v o c a t i o n h a n d l 0 1 的关键a p l 如下: p a c k a g e j a v a 1 a n g r e f l e c t ; p u b l i cc l a s sp r o x y 生成代理实例 s t a t i co b j e c tn e w p r o x y l n s t a n c e ( c l a s s l o a d e rl d r , c l a s s i f f s , i n v o c a t i o n h a n d l e rh a n d e 0t h r o w si l l e g a l a r g u m e n t e x c e p t i o n ; | t 拦截器,规定拦截处的处理逻辑 p u b l i ci n t e r f a c ei n v o c a t i o n h a n d l e r p u b l i co b j e c ti n v o k e ( o b j e c tp r o x y , m e t h o dm e t h o d , o b j e c t f la r g s ) t h r o w st h r o w a b l e ; 3 3 3 动态代理实现通用服务 动态代理可以截获方法调用,分析或修改参数,将调用传递给其他一些对象, 分析或修改结果,并将此结果返回给调用方。动态代理可透明地工作,不需要客 户程序或服务程序的信息。 下图显示动态代理实现通用服务的执行过程。通用服务只实现一个方法,即 i n v o c a t i o n h a n d l e r i n v o k e ,并用方法m e t h o d i n v o k e 转发调用,在不更改甚至读取 任何已有代码的情况下,在对象中加入附加服务。 第三章轻量级框架技术原理 方法1 , 通 服 用力法2 、 务 调用 服 调用 器 务 对 象 方法互 3 4 通用j a v a b e a n 操作 图3 - 6 动态代理实现通用服务 在j a v a 内核a p i 中也存在一些反射应用,其中非常重要的应用之一就是 j a v a b e a n 。简单地讲,j a v a b e a n 是一个包含默认构造函数的可串行化类。j a v a b e a n s 包提供了大量方便操作j a v a b e a n 的a p i ,其基础结构仍为反射机制。在j a v a b e a n s 包中比较重要的有b e a n l n f o 接口、i n t r o s p e c t o r 类、p r o p e r t y d e s c r i p t o r 类、 p r o p e r t y e d i t o r 接口等。 表3 1j a v a b e a n 操作相关类 类或接口描述 b e a n l n f o 接口b e a n l n f o 接口的实现类提供一个j a v a b e a n 的所有信息, 包括方法、属性、事件等等。由此可获得j a v a b e a n 的所 有属性,用p r o p e r t y d e s c r i p t o r 数组来表示。其实现类之 一为s i m p l e b e a n n f o i n t r o s p e c t o r 类用于探测一个表示j a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论