软件动态更新中确定实例对象转换次序的方法及***
技术领域
本发明涉及一种计算机应用技术领域的方法,具体是一种软件动态更新中确定实例对象转换次序的方法及***。
背景技术
软件构件技术的产生,使得可以依据一些关注分离规则将一个完整的应用程序划分成适当数目的软件构件模块。这些构件可以在不同的环境下独立开发和编译,并通过合适的组装方式来搭建实际的应用***,由此使构件得以重用和共享,其使用寿命也不再像传统代码模块一样受限于某个应用程序。由于生存周期的延长,构件在其服役期间将可能需要得到更新,以便改进构件实现、提供新的功能、纠正设计错误及适应运行时环境的变化等。更为重要的是,在一些任务关键型应用领域,诸如金融数据处理***、空中交通控制***、航天探测器控制软件、网格和自治计算***等,由于具有比较高的可用性需求,软件构件的更新必须在运行时完成而不导致***的中断,也就是需要进行动态更新。动态更新将用构件运行时实例的新版本来取代旧版本,而构件的运行时实例是通过某些服务对象(或直接称对象)来实现的。因此,动态构件更新将被具体化为活跃对象的更新。
通常,对单一构件而言,动态更新就是在运行时为其提供新版本构件实例,并由对应的转换函数依据各旧版本对象的当前状态,来初始化从属于该构件的所有新对象。但是,由于构件之间存在的交互依赖关系,完整的***更新将往往包含不止一个构件的更新,而是要求转换相关旧版本构件提供的所有对象。并且由于高可用性需求,在更新过程中应当尽量避免应用的延迟。一种较为合理的更新方式是懒更新(lazy upgrade),对于每个活跃对象,都恰好在应用过程或者其他更新过程访问它之前进行转换,从而确保在更新开始之后才启动的应用不会访问到未被更新的对象,也使得应用过程不会因整个***的更新而被极大地延迟。构件的关注分离特性表现在接口与实现的分离,因而构件更新可以包括内部实现的改进和接口的改变,而接口的改变有时可以是不兼容的。并且,构件更新时,用于提供状态转换等功能的转换函数,其实现不仅取决于被更新的对象本身,而且往往还依赖于构件的其他对象甚至其他构件所提供的对象。因此,为不致使在更新实际对象时因碰到不兼容的更新而导致失败,一种比较合理的方式是在更新实施之前,确定各个对象被转换的次序,以保证安全的构件更新。目前大多数与构件化软件动态更新相关的工作都重点关注新版本构件模块的加载和替换操作,而往往把合理对象转换次序的确定这一确保安全动态更新的问题留给更新管理员,甚或完全忽略。
经对现有技术文献的检索发现,德国柏林工业大学(Technischen
Berlin)的Marcin Solarski博士在其2004年的博士论文“Dynamic Upgrade ofDistributed Software Components”(分布式软件构件的动态更新)中详细阐述了构件作为动态更新单元进行动态更新时需要满足的各种功能和非功能性需求,并且提出了一套更新的方法论模型。但在其模型中并未就构件之间的运行时依赖对动态更新的影响给出详细讨论,更没有对运行时构件更新中活跃对象的转换次序给出合适的处理方法。
经检索还发现,Chandrasekhar Boyapati等在2003年“Annual ACM SIGPLANConference on Object-Oriented Programming,Systems,Languages,andApplications”(ACM SIGPLAN面向对象程序设计、***、语言及应用年会)会议论文集(Proceeding ofOOPSLA’03)第403到417页上发表的“Lazy ModularUpgrades in Persistent Object Stores”(持久对象存储中模块的懒更新),该文章中对面向对象数据库(OODB)中持久对象的更新进行了讨论,研究了对象与其子对象之间的更新次序问题,能静态保证单个类中更新语义的正确性。但其不足之处在于,由于将每一个类的转换都作为一个独立的更新事务,并且缺乏运行时对象间动态依赖性信息,仅能从静态角度为单个类中各对象和子对象的转换提供安全性保证。
发明内容
本发明针对上述现有技术存在的不足,提供一种软件动态更新中确定实例对象转换次序的方法及***,通过在构件的服务接口中添加新接口,当构件提供的对象被调用或构件类被实例化为服务对象时发出通知事件,并由确定实例对象转换次序的***中所包含的服务调用监听模块监听这类事件,以动态获取活跃对象之间的依赖性信息,并在更新时据此给出合理的对象转换次序。
本发明是通过以下技术方案实现的:
本发明涉及的软件动态更新中确定实例对象转换次序的方法,包括以下步骤:
步骤一,服务调用监听:通过开发阶段向构件所包含的类文件中增加接口方法,在***运行时监控该构件所提供全部服务对象的生存周期,获取这些方法的执行所产生的事件消息,得到对象引用信息和引用终止信息;
所述构件,是指包含契约指定接口和显示环境依赖的软件单元,对外提供两类接口:服务请求接口和服务提供接口,其组成包括:构件类文件(实现设计规范中功能需求所必须的资源)、构件描述文件、其他辅助目录和文件。本发明中的运行时仅更新由应用程序员开发、组成实际应用***的应用构件,而不更新组成软件运行平台的底层***构件,这与软件***的实际情况相符合。
所述增加接口方法,包括:对象引用宣告方法和对象引用终止方法,这两类方法在编写构件类文件时由应用开发程序员手动添加,其中:
对象引用宣告方法,其声明和定义方式相同于一般的类方法,对该方法的调用位于类的初始化模块,对象引用宣告方法最终将对象引用信息包含在消息事件中发送给服务调用监听模块,其中,初始化模块是指在一个类声明中包含的独立代码块,只要构造类的对象,初始化模块就会被执行。
对象引用终止方法,其声明和定义方式相同于一般的类方法,对该方法的调用将由应用开发程序员手动设置,对象引用终止方法最终将引用终止信息包含在消息事件中发送给服务调用监听模块。
所述对象的生存周期,是指从主调对象通过创建或服务引用而获取被调对象,一直到被调对象在主调对象中不再起作用时的一段时间,其中,主调对象是指请求服务的其他对象,被调对象则指当前对象。
所述对象引用信息,是指在通过初始创建或服务引用而获取被调对象时,用于声明这一初始化事件的信息,对象引用信息包括:类别为引用生成的消息类别、被调对象的身份标识、主调对象的身份标识、被调对象初始创建的时间戳。
所述引用终止信息,是指在之前创建和引用的被调对象不再在主调对象中起作用时,用于宣告被调对象引用终止事件的信息,引用终止信息包括:类别为引用终止的消息类别、被调对象的身份标识、主调对象的身份标识、被调对象引用终止时的时间戳。
所述身份标识,是指在对象新创建时由***运行平台为其指定的身份标识,并且这一标识具有唯一性,不会与当前已存在的其他对象相同。
步骤二,分别比较对象引用信息中的被调对象的身份标识和主调对象的身份标识,当消息类别为引用生成,且被调对象的身份标识和主调对象的身份标识分别与另一对象引用信息完全相同,仅时间戳存在差异。此时,删除时间戳较早的对象引用信息,以避免同值消息的冗余,然后将剩余不存在冗余的对象引用信息逐个与所有引用终止信息进行匹配性验证,若验证通过,则删除相匹配的对象引用信息和引用终止信息;若验证未通过,则保留该对象引用信息,得到当前实际存在的活跃对象的对象引用信息;
所述匹配性验证,是指验证对象引用信息是否满足下述所有条件:①消息类别为引用生成;②被调对象的身份标识和主调对象的身份标识分别与某个引用终止信息中的相同;③对象引用信息中的被调对象初始创建的时间戳早于被比较引用终止信息中的被调对象引用终止时的时间戳。
所述活跃对象,是指在***运行过程中某个时间区间内,因被其他对象引用或正在引用其他对象而实际起作用的对象。
步骤三,逐个比较对象引用信息中所包含的被调对象身份标识与主调对象身份标识,结合构件间静态依赖关系,区分各个对象引用信息的属性,即判断各个对象是否属于某一构件的内部对象的引用,或者是否属于不同构件间对象的引用,以获得***运行时所有活跃对象的依赖关系;
步骤四,当采用惰更新时,***中的应用过程或其他对象转换正准备调用一个待更新的对象而触发具体对象更新,结合步骤三获得的活跃对象依赖关系验证更新的完整性,运用类型检查规则验证对象引用关系是否因不兼容接口的引入而受到影响,如果受到影响则相关对象必须进行更新,通过验证以确保当前更新包含所有待更新活跃对象的更新包和转换函数,如果完整性验证通过,则继续进行下一步;否则,如果更新不完整,则产生异常信息,退出更新过程;
所述更新,其目的是改进构件实现、提供新的功能、纠正设计错误或适应运行时环境的变化等,包含对象的取代和具体的转换过程。动态更新就是在运行时为其提供新版本构件实例,并由对应的转换函数依据各旧版本对象的当前状态,来初始化从属于该构件的所有新对象。
所述惰更新,是指当***提交一个更新时,所涉及的所有对象暂不实施具体更新而将更新挂起,直到有具体应用或其他对象转换调用对象时,才实施给对象的具体更新。
所述更新的完整性,是指当更新引入不兼容的接口时,一些对象的行为将发生改变,这会影响到其他的类对象对这些对象的引用,并且也会影响由该对象所属类继承而来的子类对象,此时必需更新所有受到影响的对象。
步骤五,根据对象间运行时依赖信息以及安全对象更新条件,获得构件更新次序,,包括单一构件所包含的各个对象之间的更新执行次序以及组成整个***的各个构件所包含的对象之间的更新执行次序。
所述安全对象更新条件,是指为确保动态更新不违背更新语义、不会因更新而导致***运行停止而设置的约束,具体包括四个条件:
①对于单个对象,先提交但被挂起的更新必须先于后提交的更新而被执行;
②在某个具体更新被提交之后启动的应用过程,当需要调用该更新所影响到的对象时,总是先执行对应这些对象的具体更新,然后才继续应用过程的执行;
③在同一个完整更新中,当某个对象(依赖对象)更新的具体执行因转换过程需要而依赖于另一个对象(被依赖对象)时,依赖对象的更新先于被依赖对象;
④如果对象之间不存在运行时依赖,则其更新次序无要求。
本发明还涉及软件动态更新中确定实例对象转换次序的***,包括:服务调用监听模块、引用信息更新模块、构件依赖分析模块、完整性验证模块、更新次序选择模块,其中,
服务调用监听模块在***运行时监控构件所提供全部服务对象的生存周期,获取由对象引用宣告方法和对象引用终止方法的执行而产生的事件消息,进行分类存储,输出所有对象引用信息和引用终止信息至引用信息更新模块;
引用信息更新模块比较并删除冗余的对象引用信息,验证剩余非冗余的对象引用信息与所有引用终止信息的匹配性,输出实际存在的活跃对象引用信息至构件引用分析模块;
构件依赖分析模块比较并区分各个对象引用信息的属性,输出***运行时所有活跃对象的依赖关系信息至完整性验证模块和更新次序选择模块;
完整性验证模块根据实时获取的***运行时所有活跃对象的依赖关系信息,运用类型检查规则验证当前更新包中是否含所有待更新活跃对象的更新包和转换函数,输出更新完整性验证结果到更新次序选择模块;
更新次序选择模块接收***运行时所有活跃对象的依赖关系信息,判定对象安全更新条件的满足性,输出构件更新次序。
所述引用信息更新模块,从服务调用监听模块获取所属构件所能提供全部服务对象的对象引用信息和引用终止信息,通过比较分析排除被调和主调对象身份标识分别相同的冗余对象引用信息,然后删除与每个引用终止信息相匹配的对象引用信息,得到实际存在的活跃对象引用信息。
所述构件依赖分析模块,从每个构件的引用信息更新模块中获取所在构件正在提供服务的活跃对象引用信息,结合构件间静态依赖关系,识别各个对象引用是属于同一构件内对象的引用还是不同构件间对象的引用,得到***运行时所有活跃对象的引用依赖信息,其中,构件间静态依赖关系是指应用开发时,在构件描述文件中静态指定的构件间引用关系。
所述完整性验证模块,从构件依赖分析模块获取***运行时所有活跃对象的引用依赖信息,并结合构件间静态依赖关系,为确保更新完整性而验证当前处理的构件更新包中是否包含所有受影响的构件更新及其新版本类对象。
与现有技术相比,本发明具有如下有益效果:
(1)高度动态特征。由于是在构件开发阶段就在类文件中***对象引用宣告方法和对象引用终止方法,因此当***运行过程中,可以在不对运行时***采取任何外在干扰的情况下,动态获取构件实例对象的动态依赖关系。
(2)易实现性和通用性。在构件类文件中添加的对象引用宣告方法和对象引用终止方法,由于其功能和调用方法相同,可以通用于所有构件类文件,软件开发人员无需为构件中的每个类单独定义方法,只需作为模板方法引入即可。
(3)可适用性和可扩展性。本发明所包含的方法可适用于所有应用了面向对象范型程序设计语言开发的构件和模块化软件***,并且通过简单增加分布性和移动性特征,就可以推广扩展到分布式环境和移动计算***。
附图说明
图1为本发明确定实例对象转换次序的方法流程图。
图2为本发明确定实例对象转换次序的***结构示意图。
具体实施方式
下面结合附图给出本发明实施例的详细说明和具体实施方式:本实施例以本发明所述及技术方案为前提进行实施,给出详细的实施方式和过程,但本发明的保护范围不限于以下实施例。
本实施例中的构件实现采用Java程序设计语言和相关技术编写,并基于开放式服务平台OSGi(Open Service Gateway initiative,开放服务网关平台)来实施。每个构件对应于OSGi平台中的服务Bundle,主要包含一些实现具体功能的Java类文件、构件描述文件和其他辅助目录和文件(包括HTML文件、帮助文档、图标等)。每一个构件都对应着一个Bundle环境(BundleContext),包含关于构件的各种信息,如构件标识、构件类型、所能提供的服务接口、交互信息、通信机制等信息。对象的创建通过使用Java语言中的new方法,对象的引用通过Bundle环境(BundleContext)中的getService方法,每个构件的实例表现为对象的一个集合。
本实施例中的每个构件类的实现中都包含有一个对象引用宣告方法refDeclare的声明和定义,该方法提供所在类被实例化的信息,并通过在类中定义一个初始化块以便每次创建该类的对象时就执行该方法;该方法返回的对象引用信息包含消息类别(在此为引用生成)、被调对象的身份标识、主调对象的身份标识、被调对象被初始创建(通过new语句)或通过服务引用(通过getService语句)方法而获取时的时间戳。
并且每个构件类中还包含有一个对象引用终止方法refExpire的声明和定义,以及多个对该方法的调用;每个方法调用都对应着所在类的业务逻辑对其他对象引用的结束,并位于所引用对象开始不再起作用的位置,以表明从该位置开始相应对象不再在主调对象中被使用;该方法返回被调对象的引用终止信息。该信息包含消息类别(在此为引用终止)、被调对象的身份标识、主调对象的身份标识、被调对象引用终止时的时间戳。
对象引用宣告方法和对象引用终止方法的执行而得到的信息将被包含在消息事件中发送给服务调用监听模块。
如图1所示,本实施例应用在OSGi服务应用***,所涉及的软件动态更新中确定实例对象转换次序的方法,包括以下步骤:
步骤一,服务调用监听:通过开发阶段向构件所包含的类文件中增加接口方法,在***运行时监控该构件所提供全部服务对象的生存周期,获取这些方法的执行所产生的事件消息,得到对象引用信息和引用终止信息;
所述构件,是指包含契约指定接口和显示环境依赖的软件单元,对外提供两类接口:服务请求接口和服务提供接口,其组成包括:构件类文件(实现设计规范中功能需求所必须的资源)、构件描述文件、其他辅助目录和文件。本发明中的运行时仅更新由应用程序员开发、组成实际应用***的应用构件,而不更新组成软件运行平台的底层***构件,这与软件***的实际情况相符合。
所述增加接口方法,包括:对象引用宣告方法和对象引用终止方法,这两类方法在编写构件类文件时由应用开发程序员手动添加,其中:
对象引用宣告方法,其声明和定义方式相同于一般的类方法,对该方法的调用位于类的初始化模块,对象引用宣告方法最终将对象引用信息包含在消息事件中发送给服务调用监听模块,其中,初始化模块是指在一个类声明中包含的独立代码块,只要构造类的对象,初始化模块就会被执行。
对象引用终止方法,其声明和定义方式相同于一般的类方法,对该方法的调用将由应用开发程序员手动设置,对象引用终止方法最终将引用终止信息包含在消息事件中发送给服务调用监听模块。
在***运行时,构件实现类中的refDeclare和refExpire方法将因***的执行而不断被调用,并产生相应的对象引用信息和引用终止信息,将这两类信息表示为四元组{msgType,invokedID,invokingID,timeValue},其中,msgType表示消息类别,其值为用0表示“引用生成”,用1表示“引用终止”;invokedID和invokingID分别为被调对象的身份标识和主调对象的身份标识;timeValue表示被调对象被初始创建时或被调对象引用终止时的时间戳。
步骤二,分别比较对象引用信息中的被调对象的身份标识和主调对象的身份标识,当消息类别为引用生成,且被调对象的身份标识和主调对象的身份标识分别与另一对象引用信息完全相同,则认为该对象引用信息是冗余信息,删除该冗余的对象引用信息,然后将剩余不存在冗余的对象引用信息逐个与所有引用终止信息进行匹配性验证,若验证通过,则删除相匹配的对象引用信息和引用终止信息;若验证未通过,则保留该对象引用信息,得到当前实际存在的活跃对象的对象引用信息;
收集所有的对象引用信息和引用终止信息,通过信息表示四元组中存储的信息进行比较分析。先通过比较分析验证是否存在冗余的对象引用信息,也即两个对象引用信息的消息类别msgType、被调对象invokedID、主调对象invokingID分别相同,仅时间戳timeValue存在差异。此时,删除时间戳较早的对象引用信息,以避免同值消息的冗余。
先排除冗余,然后对每一条引用终止信息,就比较验证是否存在与其相匹配的对象引用信息。如果存在对象引用信息满足下列条件:消息类别msgType=0、invokedID和invokingID分别与对应的引用终止信息相同、且时间戳timeValue早于该引用终止信息的时间戳,则删除此对象引用信息和对应的引用终止信息。重复这一过程,直至不再存在引用终止信息。
步骤三,逐个比较对象引用信息中所包含的被调对象身份标识与主调对象身份标识,结合构件间静态依赖关系,区分各个对象引用信息的属性,即判断各个对象是否属于某一构件的内部对象的引用,或者是否属于不同构件间对象的引用,以获得***运行时所有活跃对象的依赖关系;
根据各个对象引用的属性,判定各个对象引用是属于同一构件内对象的引用还是不同构件间对象的引用。得到***运行时所有活跃对象的依赖关系信息,并生成活跃对象的依赖关系图表示G=(V,E1,E2)。其中,V为图节点,表示所有运行时活跃对象;有向边表示对象之间的引用关系,箭头起点表示主调对象,终点表示被调对象,其中,El为图中的有向边,表示同一构件内部对象之间的引用依赖关系;E2为图中的有向边,表示不同构件所属对象间的引用依赖关系。
步骤四,当采用惰更新时,***中的应用过程或其他对象转换正准备调用一个待更新的对象而触发具体对象更新,结合步骤三获得的活跃对象依赖关系验证更新的完整性,运用类型检查规则验证对象引用关系是否因不兼容接口的引入而受到影响,如果受到影响则相关对象必须进行更新,通过验证以确保当前更新包含所有待更新活跃对象的更新包和转换函数,如果完整性验证通过,则继续进行下一步;否则,如果更新不完整,则产生异常信息,退出更新过程;
所述更新,其目的是改进构件实现、提供新的功能、纠正设计错误或适应运行时环境的变化等,包含对象的取代和具体的转换过程。动态更新就是在运行时为其提供新版本构件实例,并由对应的转换函数依据各旧版本对象的当前状态,来初始化从属于该构件的所有新对象。
所述惰更新,是指当***提交一个更新时,所涉及的所有对象暂不实施具体更新而将更新挂起,直到有具体应用或其他对象转换调用对象时,才实施给对象的具体更新。
所述更新的完整性,是指当更新引入不兼容的接口时,一些对象的行为将发生改变,这会影响到其他的类对象对这些对象的引用,并且也会影响由该对象所属类继承而来的子类对象,此时必需更新所有受到影响的对象。
结合活跃对象的依赖关系图表示G,按如下步骤验证更新的完整性:
1)如果更新包中已不存在未被检查构件,则验证过程结束。否则,选取更新包中所包含的某个更新构件,运用类型检查器(type checker)验证该构件与相应待更新构件的接口兼容性;
2)如果新旧构件接口兼容,则返回第1)步继续。否则,如果新旧构件接口不兼容,则检查活跃对象依赖关系图G中是否包含该构件的实例对象;
3)如果包含该构件的实例对象,则跳转到第4)步。否则,依据构件间静态依赖(通过Imports和Exports指定的)关系,验证与该构件有引用或继承关系的构件类接口类型,如果都兼容则返回第1)步继续。否则,检查更新包中是否包含所有受影响构件的更新。如果已经完全包含,则返回第1)步继续;否则,产生异常信息,完整性验证失败,退出更新;
4)查找该对象在活跃对象依赖关系图G中的位置,沿着有向边逆向获取所有与其有依赖关系的对象信息,检查是否更新包中包含所属构件的更新。如果已经包含,则返回第1)步继续;否则,产生异常信息,完整性验证失败,退出更新。
步骤五,根据对象间运行时依赖信息以及安全对象更新条件,获得构件更新次序,包括单一构件所包含的各个对象之间的更新执行次序以及组成整个***的各个构件所包含的对象之间的更新执行次序。
所述对象安全更新条件,是指为确保动态更新不违背更新语义、不会因更新而导致***运行停止而设置的约束,具体包括四个条件:
①对于单个对象,先提交但被挂起的更新必须先于后提交的更新而被执行;
②在某个具体更新被提交之后启动的应用过程,当需要调用该更新所影响到的对象时,总是先执行对应这些对象的具体更新,然后才继续应用过程的执行;
③在同一个完整更新中,当某个对象(依赖对象)更新的具体执行因转换过程需要而依赖于另一个对象(被依赖对象)时,依赖对象的更新先于被依赖对象;
④如果对象之间不存在运行时依赖,则其更新次序无要求。
如图2所示,本实施例涉及软件动态更新中确定实例对象转换次序***,包括:服务调用监听模块、引用信息更新模块、构件依赖分析模块、完整性验证模块、更新次序选择模块,其中:
服务调用监听模块监控构件所提供全部服务对象的生存周期,在***运行时,构件各个类实例对象中的refDeclare和refExpire方法将随着应用过程而被逐步执行,监听因这两类方法的执行而产生的消息,进行分类存储,得到对象引用信息和引用终止信息,并输出所属构件所有服务对象的对象引用信息和引用终止信息至引用信息更新模块。其中的构件Bundle包含有契约指定的接口,主要提供两类接口:服务请求和服务提供,其组成除了包括实现功能需求所必须的资源(即构件类文件)文件外,还包含构件元信息描述文件、其他辅助目录和文件。
引用信息更新模块通过比较并排除被调和主调对象身份标识与被比较对象分别相同的冗余对象引用信息,验证剩余非冗余的对象引用信息与所有引用终止信息的匹配性,删除与每个引用终止信息相匹配的对象引用信息,得到实际存在的活跃对象引用信息,输出实际存在的活跃对象引用信息至构件依赖分析模块。
构件依赖分析模块从每个构件的引用信息更新模块中收集所在构件正在提供服务的活跃对象引用信息,结合构件间静态依赖关系,分析各个对象引用是属于同一构件的内部对象的引用还是属于不同构件间对象的引用,得到***运行时所有活跃对象的引用依赖信息,并输出该信息至完整性验证模块和更新次序选择模块。
完整性验证模块从依赖分析模块获取***运行时所有活跃对象的引用依赖信息,运用类型检查规则验证当前更新包中是否含所有待更新活跃对象的更新包和转换函数,并结合构件间静态依赖关系,验证当前处理的构件更新包中是否包含所有受影响的构件更新及其新版本类对象。
当构件更新满足更新完整性约束条件时,更新次序选择模块依据安全对象更新条件,分析对象间运行时依赖信息,确定合理的构件更新次序。
本实施例在构件开发阶段在类文件中***对象引用宣告方法refDeclare和对象引用终止方法refExpire,就可以在***运行过程中动态获取构件实例对象的动态依赖关系,而不需要对运行时***采取任何外在干扰。并且由于这两类方法在所有类中的功能和调用方法相似,因此可通用于所有构件类文件,软件开发人员无需为构件中的每个类单独定义方法,只需作为模板方法引入即可,这可以避免增加开发人员的时间消耗和可能造成的错误。通过增加分布协同和环境依赖特性,本实施例方法实际上也可用于实现分布和移动环境下的软件构件动态更新的运行时实例对象动态依赖关系分析和对象转换次序的确定。