首页> 中国专利> 用于应用程序执行的动态JAVA类的加载

用于应用程序执行的动态JAVA类的加载

摘要

本发明给出了用于通过分布式网络下载应用程序的方法和装置。一个示例方法包括计算机实现的方法,这种方法由通用计算机来执行,此处由计算机实现的方法能够将可执行程序从联网存储器中下载到通用计算机。该方法以核心模块的下载开始,此处核心模块包括运行可执行程序的引擎所必须的类。然后,安装核心模块,这将进而提供即时的用户功能。安装的核心模块包括这样的代码该代码用于:请求与核心模块没有关联的类;搜索可执行程序的非核心模块以获取被请求的类;以及在可执行程序提供用户功能的同时,将包含被请求的类的非核心模块下载到通用计算机。

著录项

  • 公开/公告号CN1416057A

    专利类型发明专利

  • 公开/公告日2003-05-07

    原文格式PDF

  • 申请/专利权人 精工爱普生株式会社;

    申请/专利号CN02148150.4

  • 发明设计人 李家欣;S·内尔森;B·陈;

    申请日2002-10-31

  • 分类号G06F9/445;G06F9/28;

  • 代理机构72001 中国专利代理(香港)有限公司;

  • 代理人程天正;梁永

  • 地址 日本东京都

  • 入库时间 2023-12-17 14:48:42

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-10-23

    未缴年费专利权终止 IPC(主分类):G06F9/445 授权公告日:20060726 终止日期:20171031 申请日:20021031

    专利权的终止

  • 2006-07-26

    授权

    授权

  • 2003-07-23

    实质审查的生效

    实质审查的生效

  • 2003-05-07

    公开

    公开

说明书

本申请涉及到美国专利申请No.______(代理人文档号No.AP116H0),它与本申请在同一天提交并且该申请的标题为″动态类的打包″。该申请在此引用以供参考。

技术领域

本发明总体上涉及到下载可执行程序的方法和装置,具体地讲,本发明提供了一种用于提高从因特网上下载可执行程序的速度的最佳和智能的模式。

背景技术

因特网爆炸性的增长已经给我们的工作和家居环境带来了许多活力。因为能够下载应用和软件,尤其是有关Java的应用,使我们能够进一步地提高办公室或者家居环境中个人电脑的功能。然而,从因特网上下载程序的低速度对于用户来说已成为享受这些活力的一个主要障碍。

图1所示的块图100绘制了现有技术方式,即从因特网上通过web浏览器,例如:Internet ExplorerTM或者Netscape NavigatorTM等下载可执行程序来运行Java应用程序。服务器102含有超文本标记语言(HTML)网页104。HTML网页104下载到客户端108中,下载是从因特网106通过web浏览器110实现的。ActiveX控件112下载到客户端108并由web浏览器110运行它。ActiveX控件包括对象链接和嵌入控件(OCX)114,含有Java程序和类文件的zip文件116以及.inf文件,该.inf文件给系统提供了安装OCX114和zip文件116所必须的信息。一旦ActiveX 112控件被执行,则来自zip文件116的Java程序就能够被执行了。OCX,.zip文件和.inf文件被打包为.cab文件。因此,ActiveX通过web浏览器安装.cab文件并解压缩zip文件以运行不同的Java应用类。

因为在Java应用程序运行之前,必须下载完整的.cab文件,所以如果使用现有技术方式来下载应用程序,那么由此而强加的延迟就会使用户不愿从因特网上下载应用程序,除非用户能使用快速的上网方式。例如,如果使用56K的拨号调制解调器,下载和安装一个典型.cab文件可能要花费5分钟或者更多的时间。即使用户不用某些类,在应用功能实现之前,用户也必须要等待足够的时间来下载所有包含于zip文件的类。因为.cab文件会随着更多的或者增强的功能的增多而变大,所以等待的时间也会随着软件功能的增强而进一步增加。

尽管在首次下载应用程序时会存在这种问题,然而它也会延伸到应用程序的更改。例如,如果对已存在的程序进行了1KB的新修正或者更新的修改,那么用户将不得不下载整个应用程序或者发邮件定购装有已修正的应用程序的光盘或者软盘。然而,为了尽量降低成本,公司一直都希望用户通过因特网下载文件而不是通过装运光盘或者软盘的方式来获得新的或者已修正的应用程序。

尽管在有些情况下能够给出补丁程序,然而补丁程序的管理却不容易控制。例如,当要安装多个补丁的时候,在后来得到的补丁安装时,早期的补丁要么还没有安装要么在后来的补丁之后安装,问题就会出现。在这种情况下,程序就可能不会正确地运行并且随着将来的补丁的发布,问题本身也会变得很混乱。因此,补丁安装的管理就使补丁成为一种不可行的选择方案。

因此,有必要解决现有技术的问题以提供一种用于快速有效地从因特网上下载应用程序的方法,下载的同时还保持了对用户是可用的应用程序的功能。

发明内容

广义地讲,本发明填补了这些不足,提供了通过因特网高效地下载应用程序的方法和装置。应当理解的是,本发明能够采用许多种方式实现,它们可以作为进程、装置、系统、或者设备。本发明的数个说明性的实施方案描述如下。

在一种实施方案中,给出了计算机实现的方法,它由通用计算机执行,它能够将可执行程序从联网存储器中下载到通用计算机。该方法以核心模块的下载开始,这里的核心模块包括运行可执行程序的引擎所必须的类。然后,安装核心模块,这将进而提供即时的用户功能。安装的核心模块包括以下这样的代码,该代码用于:请求与核心模块没有关联的类;为请求的类搜索可执行程序的非核心模块;以及在可执行程序提供用户功能的同时,给通用计算机下载包含被请求的类的非核心模块。

在另一种实施方案中,给出了一种方法,它用于在多线程环境中下载应用程序的模块。在下载进行的同时,应用程序的核心模块正在运行,它允许用户应用和应用程序的各种特征进行交互。核心模块执行的方法以正被请求的第一个模块开始,同时第二个模块正在下载。然后,挂起第二个模块的下载。下一步,下载第一个模块。接着,在第一个模块的下载完成之后,第二个模块的下载继续进行,由此正在运行的应用程序就能够使用户应用程序对基本功能的交互因核心模块而变得容易。此外,应用程序正在运行的同时,一旦完成后台的安装,就能够使用由第一个模块和第二个模块中的每一个所提供的功能。

另外还有一种实施方案中,给出了一种方法,用于将模块从分布式网络上下载到通用计算机中供应用程序使用,下载的同时应用程正在通用计算机上运行。方法以启用对应用程序的选择开始。接着,运行被选择应用程序的引擎的核心模块被识别。下一步,下载和安装核心模块。下一步,启动对应用程序的非核心模块相关特征的选择。为了响应对非核心模块相关特征的选择,该方法包括,确定非核心模块是否在本地通用计算机上,如果非核心模块不在本地,从分布式网络上下载非核心模块,以及安装非核心模块。确定、下载和安装正被执行的同时,启用用户对核心模块已安装的特征的访问与交互。

在再另外一种实施方案中,给出了一种计算机实现的方法,用于将应用程序安装到通用计算机上。该方法以确定核心模块是否在本地通用计算机上开始。该确定包括,如果核心模块在本地通用计算机上,则确定其是否是最近的版本。为了响应核心模块不在或者核心模块不是最近版本,方法进一步包括核心模块的下载,这里核心模块包括运行应用程序的引擎所必须的类。接着,安装核心模块。安装的核心模块提供即时的用户功能。下一步,非核心模块是否短缺被预测。然后,在应用程序正在执行的同时,下载所预测的非核心模块。

在还有另一种实施方案中,给出了一种方法,用于将计算机程序从网络上下载到通用计算机上,此处计算机应用程序被划分为模块。该方法以下载核心模块开始。核心模块包括运行计算机程序引擎所必须的类。接着,安装核心模块。安装的核心模块给出即时的用户功能。下一步,根据优先权列表下载非核心模块。接着,根据用户请求的特征功能,请求一个既没有被下载也不是正在被下载的非核心模块。下一步,根据优先权列表暂停非核心模块的下载。接着,启动该含有特征功能的非核心模块的下载。下一步,安装非核心模块。然后,根据优先权列表继续下载非核心模块。

在另一种实施方案中,给出了一种装置,用于下载应用程序。装置包括存储单元,用于存储执行应用程序的编码指令。装置也包括监视器,用于给用户显示应用程序的特征。应用程序特征与应用程序的模块相关联,模块包含执行应用程序特征的编码指令。装置还包括处理器。处理器要配置以处理编码指令,其中编码指令要被配置成下载和安装应用程序的核心模块。核心模块能够运行应用程序的引擎并且立即允许用户和应用程序交互,其中根据用户选择的与非核心模块相关的一个应用程序特征,下载,安装和启用非核心模块以使用即时功能,同时一起使用核心模块所提供的功能。

在另外还有一种实施方案中,给出了一种计算机可读媒体,它包含用于从网络上下载可执行程序的程序指令。计算机可读媒体的例子包括下载核心模块的程序指令,此处核心模块包括运行可执行程序的引擎所必须的指令。此外,计算机可读媒体包括安装核心模块的程序指令。安装的核心模块更深一层地包括这样的程序指令,该程序指令用于请求与核心模块没有关联的类,搜索非核心模块以获取被请求的类,以及在可执行程序提供用户功能的同时,下载包含被请求的类的非核心模块。

本发明有许多优点。最值得注意的是,可执行程序能够通过分布式网络高效地下载。通过下载包含运行应用程序的引擎所必须的代码的核心模块,用户就能够运行程序而不必忍受任何过分的延迟,即使是用拨号连接方式来下载。此外,预测用户需要的用于下载的模块的能力或者后台下载模块能力以一种对用户透明的方式提供了更高的灵活性和效率。

本发明的其它方面和优点将随着下列结合对应附图的详细描述,以及用举例方式对发明原理的图解而变得清晰。

附图说明

结合对应附图,其中相同的数字表明相同的结构元素,通过下列详细描述,本发明就会容易理解了。

图1所示为块图,绘制了现有技术方式,即从因特网上通过web浏览器下载可执行程序,并运行Java应用程序。

图2所示为流程图,绘制了按照本发明的一种实施方案从因特网上下载应用程序的方法概况。

图3所示为流程图,绘制了按照本发明的一种实施方案的一种高层方法,它周Java加载器下载和安装应用程序。

图4所示为块图,显示了按照本发明的一种实施方案在图3的操作146中下载的模块列表。

图5所示为按照本发明的一种实施方案的流程图,展示了一种方法,在需要的时候,应用程序正在运行的同时,进行模块的下载和安装。

图6所示为按照本发明的一种实施方案的流程图,更详细地描述了应用程序的模块的下载。

图7所示为按照本发明的一种实施方案的流程图,更详细地描述了图6的操作190,图中包含请求类的模块通过类加载器线程而被定位。

图8所示为按照本发明的一种实施方案的流程图,它表示一种方法,一旦主应用程序已经启动,它用于在多线程环境中执行后台下载。

图9所示为按照本发明的一种实施方案的块图,表示将被下载的用于应用程序的各种模块的优先权列表。

图10所示为按照本发明的一种实施方案的流程图,更详细地描述了图7的操作208,图中,模块的下载是在多线程环境中根据下载管理器逻辑实现的。

具体实施方式

所描述的发明作为这样的装置和方法,它们用于高效有序地下载应用程序,其中核心模块首先被下载,核心模块包含运行应用程序的引擎所必须的类。接着,在一种实施方案中,其余非核心模块即使是应用程序正在运行也是在后台下载,并且在有需要时,非核心模块被自动上载到正在运行的程序中。然而,显而易见的是,对谙熟本领域的人来说,不需要给出部分或者全部的具体细节,本发明也可以被实现。在其它情况下,非常熟悉的处理操作没有进行详细的描述,这样做的目的是为了不弄模糊本发明。

本发明的实施方案提供了这样的方法和装置,它们通过因特网高效地将应用程序组件从位于中心的源(例如,硬件和软件销售商)分发到终端用户。在一种实施方案中,用户能够访问网上站点以选择不同应用和选项。如在这里所用的,能够高效地处理和下载应用及组件的实施方案,通常适用于任何类型的应用和应用组件。然而,为了便于论述,将会引用适用于打印机用户的打印机和应用选项。这些应用和选项可以在,例如,销售商的站点找到。参照这个例子,关于打印机的应用程序可以是用于创建贺卡、请柬、图书封面、图片模板、名片、礼品包装纸以及礼品盒等。一旦用户选择了一个应用选项,则该应用选项会有额外的许多可供选择的子选项。在一种实施方案中,可选择一个选项,其中可以包括更多的内容来生成一种方案,例如给贺卡添加一附图。

在一种实施方案中,作为完整程序的所有程序的选择项,或者程序选择项组,能够被识别,并且为每个选择项或者选择项组创建一个软件类模块。所选择的模块中每个都包含实现特定程序任务必须的所有的类。例如,一个模块可能包括生成图形用户界面(GUI)用的所有的类,另一个模块用于选择和下载图象,第三个用于打印,第四个用于旋转和剪切图象等等。在一种实施方案中,至少一个模块必须包括运行该实施方案中应用程序的引擎所必须的核心类。核心模块可以从命令行接收指令,或者更优选方式是,核心模块下载和安装GUI模块以给用户提供更加方便的界面。

为了加速程序的下载,在可执行程序将被下载之前,首先仅下载核心模块。然后,由核心模块来下载和安装GUI模块,它给用户显示各种程序选项。在一种实施方案中,程序正在运行的同时,如果用户选择的选项不是核心模块的一部分,那么核心模块就进行检查以确定能够实现被选择项的模块是否在本地(例如,在用户驱动器或者网络驱动器上)。在另一种实施方案中,如果需要的模块不在本地,那么需要的模块就从因特网上下载并且自动上载到正在运行的程序。如果需要的模块以前已被下载过,那么核心模块就进行检查以确定需要的模块的当前版本是否比核心模块的版本老。如果有该版本,需要的模块并不比核心模块老,则使用本地可用的模块,但如果需要的模块是更老的,那么从因特网上下载更新的模块。

在另一种实施方案中,应用程序可以根据当前用户的选择预测将来所需的模块,并可以在后台下载更多的模块,这里这些模块是核心模块认为在不远的将来会用到的。例如,如果用户使用应用程序下载并编辑了一幅照片图象,则该应用程序的核心模块可能会认为用户将可能想要打印所编辑的图象。在这种情况下,打印模块可能在用户完成编辑之前就下载了,因此允许用更快更高效的方式从因特网上下载可执行的文件,并且下载的同时用户仍然能使用应用程序的全部功能。在再一种实施方案中,模块预测性的下载可以根据观察用户的行为的统计分析进行,从而就可将似乎与程序无关的选择项链接起来以在后台下载。

图2所示为按照本发明的一种实施方案的流程图122,它绘制了从因特网上下载应用程序的方法概况。流程图122以操作124开始,在操作124中访问提供应用程序选项的站点。正如在前面所提到的一样,应用程序和其选项可以是任何类型的应用,它可由一个或者多个处理实体来执行。在连接个人电脑的打印机的例子中,应用可以包含用于创建贺卡、请柬、图书封面、图片模板、名片、礼品包装纸以及礼品盒等的功能。方法进入到操作126,其中目录类别选自选项列表。这里,用户从操作124选择了一个上面提到的应用并且目录类别列表也显示给用户。例如,用户可以选择创建贺卡,其与用于贺卡的目录列表一起显示给用户。当然,任何数目适合贺卡的图象在这里都能够显示,例如花的排列图案、印花以及电影明星的照片等。下一步,在操作128,给出了所选目录类别的图象选项。在一种实施方案中,图象存储在数据库中。下一步,方法进入到操作130,此处记录所选图象的标志。这里,所存储图象用于以后Java的应用。

继续描述图2,在操作132中收集打印机和纸的信息。在第一种实施方案中收集打印机型号、纸张尺寸、页边距信息等。下一步,在操作134中,下载引导加载器。这里,网络浏览器下载和安装.cab文件,用于加载Java应用程序和与该Java应用程序关联的各种模块。方法进入操作136,此处给用户显示了安全选项。在一种实施方案中,如果用户拒绝安全选项,那么方法就会结束。如果用户接受了安全选项,那么方法就进入到操作138,网络浏览器在此处解压缩并安装引导加载器即,.cab文件。下一步,在操作140中,执行引导加载器。在一种实施方案中,引导加载器采用ActiveX控件的形式。接着,方法进入操作142,此处引导加载器启动Java加载器。在一种实施方案中,Java加载器包含于.cab文件中。在下面更详细的解释中,Java加载器启用所需要应用程序的高效迅速的下载,而不论用户因特网连接的速度是否相对较慢。也就是说,应用程序将立即可以使用,而不论一个任务需要的所有组件是否已全部被下载。

图3所示为流程图144,绘制了按照本发明的一种实施方案的一种高层方法,其中Java加载器下载和安装应用及其组件。方法从操作146启动,此处下载操作124的应用程序所用的模块列表。在一种实施方案中,模块列表包括模块名和模块的版本信息。模块列表的例子在图4中展示并且其在下面会有更详细的解释。

移到图4,块图158图示了按照本发明的一种实施方案的在图3操作146中所下载的模块列表。应当理解的是,在块图158中所示的模块列表仅是数个模块的说明,因此,是否可以存在任意数目的模块取决于软件的应用程序及其用途。回想前面所述的,应用程序160,核心模块以及多个非核心模块均被展示了。这里,所展示的是核心模块版本1即162已经被核心模块版本2即164替换的情况。因此,在图3的操作146中所下载的模块列表仅仅包括最近版本的核心模块,即一种实施方案中的版本2即164。应当理解的是,核心模块版本1也被显示,这样做仅是为了说明问题。图4的列表进一步包括模块1-5,由块166-174表示。在本发明的一种实施方案中,应用程序所用的模块列表和本地系统中的模块相比较,以确定系统需要的哪些模块将被下载。

返回到图3,方法进入操作148,此处Java加载器将审查列表上的每个模块以验证模块是否在本地系统中。例如,图4的每个模块,即模块164-174,要被检查以确定它们是否已经存在于本地系统。下一步,在操作150中,任何被操作148识别的老版本模块均要被卸载。例如,如果本地系统的核心版本1即162是从以前所用的应用程序加载的,那么它会在这里被卸载。此外,如果在本地系统上有任何更老版本的非核心模块,那么它们将被卸载。在一种实施方案中,如果更老版本的非核心模块是一个共享模块,那么非核心模块将不会被卸载。下一步,方法进入到判定操作152,此处要确定的是最新版本的核心模块是否在系统中。如果最新版本的核心模块不在系统中,那么最新版本的核心模块将在操作154下载并安装。在本发明的一种实施方案中,核心模块包括含有入口点的类。在本发明的另一种实施方案中,含有入口点的类被Java加载器所请求以启动核心模块的下载。如果最新版本的核心模块在本地系统中,那么方法就进入到操作156,此处启动应用程序。

图5所示为按照本发明的一种实施方案的流程图176,它展示了一种方法,在需要的时候,应用程序正在运行的同时,它下载和安装模块。流程图176以操作178开始,此处应用程序正在本地系统中运行。应当理解的是,当用户正在运行应用程序并使用各种功能的时候,除了核心模块之外,最终会需要某个模块。按照打印机的例子,没有包含于核心模块的类可能是需要的以进行某些操作例如,打印,编辑,安排格式等。下一步,方法进入操作180,此处识别包含需要的类的模块。方法移到操作182,此处下载包含需要的类的模块并将其安装到本地系统中。例如,参考图4,如果模块4即172对于应用程序的具体特征是所必须的,那么模块4即172将会被下载和安装。方法进入操作184,此处执行由所下载的模块的类提供的特征功能。在操作184之后,方法返回到操作178,应用程序从那继续运行。当然,在一种实施方案中,应用程序的组件大体上均是在后台运行的。用户也能够按照自己的意愿随时停止或者退出应用程序。

图6所示为按照本发明的一种实施方案的流程图186,它更详细地描述了应用程序的模块的下载。流程图186以操作188开始,此处接收来自Java虚拟机(JVM)的请求。例如,当首次启动应用程序时,类加载器将会收到来自Java虚拟机(JVM)的请求以运行一种实施方案中的主类。主类包含于本发明另一种实施方案中的核心模块。应当理解的是,Java虚拟机仅关心类而与模块无关,而类加载器将类映像到模块中。

下一步,方法进入操作190,此处找到了包含类的模块。操作190参照图7将会有更详细的解释。下一步,在判定操作192中,要确定的是,在操作190中所找到的模块是否已安装在本地系统中了。如果模块不在本地系统中,那么在操作194中下载和安装模块。如果模块已安装在本地系统中,那么方法就从操作192进入到操作196,此处从模块中获取所需要的类对象。

一旦用图6的方法从模块中获取了类对象,那么方法返回到操作188。在一种实施方案中,类对象在此处被回送给Java虚拟机。应当理解的是,当应用程序首次加载到本地系统的时候,在所有内部相关的类加载完之前,包含入口点的类会请求下一个类,并依此类推。在一种实施方案中,包含入口点的主类被映像到核心模块中。作为一个说明性的例子,类A包含入口点并且当启动时,它首先被Java虚拟机请求。在组成核心模块的所有内部相关的类加载完之前,类A将请求类B,并依此类推。

上述说明性的例子也可应用到其它参与了特征功能的非核心模块。一旦安装了包含核心模块的类,那么用户就可以选择执行需要特征功能的任务。在打印机及其应用的例子中,用户或许想要旋转或者打印图形。一旦激活了旋转或者打印按钮,那么代码将会向Java虚拟机请求能实现特征功能的类。因此,Java虚拟机将会请求用于特征功能所需要的类并且操作188-196将会重复以获取所需要的类和所有内部相关的类。参照图8-10,将会有更详细细节的解释,在能实现特征功能的模块被另一种实施方案中的用户请求之前,它也可以在后台下载。

流程图190以操作198开始,此处Java虚拟机请求类加载器以加载类。方法进入操作200,此处搜索已安装的模块以获取被请求的类。对本领域谙熟的人应当理解的是,各种不同的技术都可用来搜索数据结构以获取被请求的类。下一步,方法进入判定操作202,以确定是否已经找到所请求的类。如果发现类被安装在本地系统的模块中,那么类就被回送给操作204中的Java虚拟机。

如果没有找到该类,那么图7的方法就进入到206,此处要查询服务器以确定哪个模块包含被请求的类。在第一种实施方案中,每个类和服务器中的一个模块关联,即服务器含有和模块的类相匹配的数据结构。因此,在本发明的一种实施方案中,包含被请求的类的模块在此处被识别。方法进入到操作208,在此处下载包含所请求的类的模块。在一种实施方案中,模块是以一个内部相关类接下一个的方式进行下载的,如图6所论述的一样。在再一种实施方案中,已下载模块也被安装。

如下的表1包括按照本发明的一种实施方案的安装模块的说明性的代码。当然,代码可以采用任何形式,只要能够完成安装函数就可以。

                         表1

*copyright@1995~2001 EPSON Palo Alto实验室。版权所有。//加载包含于zf.中的包。public static void installPackage(File zFile)throws IOException{ZipFile zf=new ZipFile(zFile);try{  Archiveinfo ai=new Archiveinfo(zf)  //保存资源文件  for(Enumeration e=zf.entries();e.hasMoreElements();){   ZipEntry ze=(ZipEntry)e.nextElement();  String zipName=ze.getName();  if(!zipName.endsWith(″.class″)){  ze=zfgetEntry(zipName);   zipName=zipName.replace(′\\′,′/′);   InputStream is=zf.getlnputStream(ze);   if(ai.isSharedModule()){  saveResource(SmartLauncher.getSharedResourceDir(),zipName,is);   }else{   saveResource(SmartLauncher.GetAppResourceDir(),zipName,is);}  }  //查找系统类文件并且将它们安装到共享类目录。  for(Enumeration e=ai.getSystemClasses().elements();e.hasMoreElements();){   String sysClass=(String)e.nextElement();<!-- SIPO <DP n="11"> --><dp n="d11"/>  ZipEntry ze=getzipEntryFromClassName(zf,sysClass);  if(ze==null){  throw new IOException("Can not find system class″+sysClass);  }  InputStream is=zf.etlnputStream(ze);  saveClass(SmartLauncher.getSharedSystemClassDir(),sysClass,is);  }  //查找系统类文件并且将它们安装到共享类目录。  for(Enumeration e=ai.getSystemResources().elements();e.hasMoreElements();){  String sysResource=(Sring)e.nextElement();  ZipEntry ze=zf.getEntry(sysResource);   if(ze==null)  throw new IOException("Can not find system class″+sysResource);  }  InputStream is=zf.getlnputStream(ze);  SaveResource(SmartLauncher.getSharedSystemClassDir(),sysResource,is);  }//调用安装函数  if(ai.getMetaClass()!=null)   try{  InstallClassLoader instailLoader=new InstaliClassLoader(zf);  Class clsMeta=installLoader.loadClass(ai.getMetaClass(),true);  Object mc=clsMeta.newlnstance();  Class[]clsParams={java.util.Hashtable.class};  Method m=clsMeta.getMethod(″install″,clsParams);  Object[]obj Params={createInstallProperties(getSmartClassLoader(),zf);  //调用安装函数  m.invoke(mc,objParams);   }catch(Exception e);  //不能够调用元类安装。  System.out.println(″Install function ignored in class″+ai.getMetaClass())<!-- SIPO <DP n="12"> --><dp n="d12"/>  }   }  }finally{   zf.close();}

图8所示为按照本发明的一种实施例的流程图210,表示一种方法,一旦主应用程序已启动,它用于在多线程环境中执行后台的下载。应当理解的是,流程图210的方法能够在多线程环境中与参照图7所描述的方法一起作业。流程图210以操作212开始,此处访问要下载的模块列表。在一种实施方案中,模块列表包括优先权列表,它表示模块在后台环境被下载的顺序。优先权列表的例子将参照图9在下面描述。

图9所示为按照本发明的每一种实施方案的对应块图224,它表示要下载的用于应用程序的各种模块的优先权列表。如块图224中所展示的,包含应用程序的每个模块被赋予了一个优先权。例如,核心模块(Mc)226被赋予优先权1,是最高的优先权。核心模块必须被首先下载,因此,Mc必须接收最高优先权。剩余的模块M1-M5,即228与优先权2-6分别对应。在一种实施方案中,优先权列表存放于联网资源服务器中(例如,它包含了应用程序和其模块)。如下面更进一步的解释,在本地系统可以从先前运行的应用程序中安装过一些模块。在这种情况下,下载管理器将以所需的下载模块列表初始化,从而要确保下载管理器将不会下载那些已经安装的模块。模块列表也可以是图4的模块列表,其优先权包含于本发明的一种实施方案中。

返回到图8,一旦在操作212中访问了优先权列表,则方法就进入判定操作214中,在此要进行检查以确定所有模块是否已下载到了本地系统中。这里,参照图3、4和9所论述的模块列表被检查以确定哪个模块需要被下载(如果有的话)。如果列表中的所有模块已安装在本地系统中,那么方法就在操作216结束。如果所有模块还没有被完全下载,那么方法就进入操作218,在此获取要下载的模块名。例如,如果Mc和M2已经被安装到本地系统中,那么将在操作218获取模块名M1,因为M1在剩余的模块中具有最高的优先权。与操作218中所获取的模块名对应的模块在操作220下载。下一步,所下载的模块在操作222安装。应当理解的是,按照本发明的一种实施方案安装模块用的例子代码,它在表1中已展示,可以在操作222执行。包括操作214-222的循环将会自行重复直到所有模块均被下载。

图10所示为按照本发明的一种实施方案的流程图230,它展示了图7的操作208的更详细的描述,图中模块的下载在多线程环境中根据下载管理器逻辑进行。流程图208以操作232开始,此处向下载管理器请求要下载的模块。应当理解的是,类加载器在此有控件。方法进入判定操作234,在此要确定的是所请求的模块是否正在被下载管理器下载的模块。如果所请求的模块正在被下载管理器下载,那么方法移到操作236,在此,方法等待到下载管理器完成模块下载为止。应当理解的是,谙熟本领域的技术人员所熟知的常用暂停技术在此操作中能够使用。

另一方面,如果在图10的判定操作234中,所请求的模块并不是正被下载管理器下载的模块,那么方法就进入操作240,在此挂起当前的下载。例如,某用户打算旋转图象,则要用到实现特征功能的模块4(M4)。然而,下载管理器正在下载的模块却是模块3(M3),因此M3的下载就在操作240中被挂起,从而就可下载M4而避免与M3竞争带宽。在本发明的一种实施方案中,仅当用户中断了由优先权列表所管理的模块的顺序下载时,包含这个判定操作的下载管理器的逻辑才启动。方法进入操作242,在此下载请求的模块。继续上面的例子,随着M3的挂起,M4会在此下载。在一种实施方案中,下载过M3的代码的另一个实例用于下载M4。在操作244中,安装被请求的模块。方法移到操作246,在此被挂起的下载线程就继续进行。参照上述例子,当一完成M4的安装,M3的下载就继续进行。下一步,在操作248中,方法进入图8的操作220,这里模块被下载。

如下的表2包括按照本发明的一种实施方案的类加载器的说明性的代码对应。当然,代码可以采用任何形式,只要加载函数能够实现就可以。

                     表2

/*“*$Workfile:SmartClassLoaderjava$“*”*copyright@1995~2001 EPSON Palo Alto实验室。版权所有。*EPSON Research and Development,Inc。Seiko EPSON的子公司。*版权所有。**/package epal.compman;import java.util.*;import java.util.zip.*;import java.io.*;import java.net.*;import java.lang.*;import java.lang.reflect.*;  /**  *类的说明从这里开始。  *  */  public class SmartClassLoader extends java.lang.ClassLoader{  //从类名映射到被加载的类对象。  private Hashtable m_classCache=new Hashtable();  //从包名映射到归档文件。  private Hashtable m_packageMap=new Hashtable();  //从类名映射到归档文件。<!-- SIPO <DP n="15"> --><dp n="d15"/>private Hashtable m_classMap=new Hashtable();//从资源名映射到归档文件。  private Hashtable m_resourceMap=new Hashtable();public SmartClassLoader()throws IOException{super();}public URL getResource(String name){URL url=getSystemResource(name);if(url!=null)  return uri;  String szResourceFile=name.replace(‘/’,File.separatorChar);  File f=new File(SmartLauncher.getAppResourceDir(),szResourceFile);  try{  return new URL(″file″,″localhos",f.GetAbsolutcPath());  }catch(Exception e){  return null;  }}public InputStream getResourceAsStream(String name)  InputStream is=getSystemResourceAsStream(name);  if(is!=null)   return is;  String szResourceFile=name.replace(‘/’,File.separatorChar);  File f=new File(SmartLauncher.getAppResourceDir(),szResourceFile);  try{   return new FileInputStream(f);<!-- SIPO <DP n="16"> --><dp n="d16"/>}catch(Exception e){  return null;}  }protected Class loadClass(String name,boolean resolve)throwsClassNotFoundException{// System.out.println(name);  if(name.indexOf("PIMjpegNative″)!=-1){int i=10;}  if(name.indexOf("JopsDecoder″)!=-1){inti=10;  }  //检查类在前面是否已经加载。  Class c=(Class)m_classCache.get(name);  if(c!=null){  if(resolve){   resolveClass(c);  }  return c;  }  ArchiveInfo ai=(ArchiveInfo)m_classMap.get(name);  if(ai!=null){  //检查这里的Archiveinfo的版本。  //Hack:假设总是ok。  //类能够从zip文件中被加载。  //现在检查类是否应当从系统加载。<!-- SIPO <DP n="17"> --><dp n="d17"/>if(ai.getSystemClasses().indexOf(name)!=-1){//这是一个应当由系统类加载器加载的类。c=findSystemClass(name);}else//从zip文件加载。ZipEntry ze=SmartLauncher.getZipEntryFromClassName(ai.getZipFile),name);try{  c=loadClassFromZipEntry(ai.getZipFile(),ze,name);  }catch(IOException e){  throw new ClassNotFounException(″Can not find class″+name);  }  }  }else{//类不能够从zip文件加载。Try{  //尝试从系统加载。  c=findSystemClass(name);  }catch(Exception e)   //类既不能从zip文件也不能从系统加载。   //这个类可能是:  //1.一个没有查找到的被请求的resource bundle类。  //2.一个不应该下载或者安装的类。  if(isResourceBundleClass(name)){  //VM(虚拟机)正在请求一个package bundle类。  throw new ClassNotFoundException();  }  //该类从系统不能找到。尝试去下载该类并安装它。  try{  File f=SmartLauncher.getDownloadManager().getZipFile(name);  SmartLauncher.getSmartClassLoader().loadPackage(f); }catch(Exception ioe)  throw new ClassNotFoundException(ioe.getMessage());<!-- SIPO <DP n="18"> --><dp n="d18"/>  }  ai=(Archiveinfo)m_classMap.get(name);  if(ai==null)  //我们应该在此处查找该类。  .throw new ClassNotFoundException();  }else try{   if(ai.getSystemClasses().indexOf(name)!=-1){   //这是一个应该由系统类加载器加载的类。   c=findSystemClass(name);   }else{   //从zip文件加载。   ZipEntry ze=SmartLauncher.getZipEntryFromClassName(ai.getZipflle(),name);   c=loadClassFromZipEntry(ai.getZipFile(),ze,name);  }   }catch(Exception ex){  throw new ClassNotFoundException(ex.GetMessage());   }   }  }}  if(resolve){   resolveClass(c);   }   m_classCache.put(name,c);   return c;   }  public void loadPackages()throws IOException{  File dir=SmartLauncher.getAppDir();<!-- SIPO <DP n="19"> --><dp n="d19"/>String[]zfname=dir.list();  if(zfname!=null)   for(int i=0;i<zfname.length;i++){   if(zfname[i].endsWith(″.zip″)){  try{   loadPackage(new File(dir,zfname[i]));  }catch(ZipException ze){   File f=new File(dir,zfname[i]);   f.delete();  }  }  }  }  dir=SmartLauncher.getSharedDir();  zfname=dir.list();  if(zfname!=null)  for(int i=0;i<zfname.length;i++){   if(zfname[i].endsWith(″.zip″)){   try{   loadpackage(new File(dir,zfname[i]));   }catch(ZipException ze){   File f=new File(dir,zfname[i]);   f.delete();   }  }  }  }  }  public void loadpackage(flle fZipFile)throws IOException{   ZipFile zf=new ZipFile(fZipFile);<!-- SIPO <DP n="20"> --><dp n="d20"/>  Archiveinfo ai=new Archivelnfo(zf);//加载类。for(Enumeration e=zf.entries();e.hasMoreElements();){  ZipEntry ze=(ZipEntry)e.nextElement();  String zipName=ze.getName();   if(zipName.endsWith(″.class″)){  String className=getClassNameFromZipName(zipName);  m_classMap.put(className,ai);  m_packageMap.put(getPackageName(className),ai);   }else{   zipName=zipName.replace(‘\\’,’/’);   m_resourceMap.put(zipName,ai);   }  }}  //加载包含于ze的类。private Class loadClassFromZipEntry(ZipFile zf,ZipEntry ze,String className)throws IOException{  String szZipName=ze.getName();  InputStream is=zf.getInputStream(ze);  ByteArrayOutputStream baos=new ByteArrayOutputStream();   byte[]tempBuf=new byte[1024];  int bytesRead=0;  try{ do{   bytesRead=is.read(tempBuf,0,1024);  if(bytesRead>0){   baos.write(tempBuf,0,bytesRead);  }<!-- SIPO <DP n="21"> --><dp n="d21"/>   }while(bytesRead>=0);  }catch(EOFException eofex){   //这是精细搜索。   }  is.close();  byte[]clsData=baos toByteArray();   return defineClass(className,clsData,0,clsData.length);  }   private String getClassNameFromZipName(String zipName)  int index=zipName.lastlndexOf(″.class″);if(index<=0)  return null;  String className=zipName.replace(‘/′,′.′);  className=className.replace(‘\\’,′.′);  return className.gubstring(0,index);}/**  回送类的包名。  */private String getPackageName(String className){  int index=className.LastlndexOf(“.”);  if(index<=0)  return“”;  return className.substring(0,index);  }private String getBaseclassName(String name){int iBegin=Math.max(0,name.lastlndexOf(″.″));int iEnd=name.indexOf(″_″,iBegin);if(iEnd==-1){<!-- SIPO <DP n="22"> --><dp n="d22"/>return name;  }  return name.substring(0,iEnd);  }private boolean isResourceBundleClass(String name)String base=getBaseclassName(name);base=base.replace(‘.’,File.separatorChar);  File f=new File(SmartLauncher.getAppResourceDir(),base+″.properties″);if(f.exists())  return true;  return false;  }}

尽管上面所描述的发明是在通用的含义上说明了在与个人计算机相结合的操作系统上执行的应用程序,但是应当理解的是,本发明可以用其它例程、程序、组件以及数据结构等来实现,它们能执行特定的任务或者实现特定的抽象数据类型。进一步地讲,本发明可以用其它计算机系统装置来实现,其中包括手持式设备、微处理器系统、基于微处理器的或者可编程的消费类电子设备,微型计算机以及大型计算机等。本发明也可以在分布式计算环境中被实现,在这种环境中,任务的执行是由链接到通讯网络的远程处理设备来实现的。

回想一下上面的实施方案,应当理解的是,本发明可以使用各种计算机实现的操作,这些操作涉及到存储于计算机系统中的数据。这些操作需要用到各种物理量的物理处理。通常情况下,尽管并不是必须的,这些量采用的是电或磁信号,它们能够被存储、转移、合并、比较以及进行其它方面的处理。更进一步地讲,所执行的操作经常作为术语被提到,例如:产生、识别、确定或者比较等。

这里所描述的任何操作,作为本发明的一部分,都是有用的机器操作。本发明也涉及到一种用于执行这些操作的设备或者装置。装置可以是为完成所需而专门构造的,或者可以是通用计算机,这种计算机通过存储于计算机的计算机程序能够有选择地激活或者配置。具体地讲,各种通用机器可以和计算机程序一起使用,其中计算机程序是根据这里所讲述的内容编写的,或者它可以是一种更便于构造成执行所需操作的更专门的装置。

本发明也能够体现为存储在计算机可读媒体中的计算机可读代码。计算机可读媒体是任何类型的数据存储设备,它们能够存储数据并且以后这些数据还能够被计算机系统读取。计算机可读媒体的例子包括硬盘、网络直连存储(NAS)、只读存储器、随机访问存储器、CD-ROM、CD-R、CD-RW、磁带以及其它光学及非光学型的数据存储设备。计算机可读媒体也能够发布到链接了计算机系统的网络上从而能够使计算机可读代码以分布式方式被存储和执行。

尽管为了使发明能清楚地被理解,前述发明描述得相当详细,但是显而易见的是,在所附的权利要求范围之内的某种程度的改变和修改方案是可以实现的。因此,本实施方案将被认为是说明性的而不是限制性的,并且本发明将不会被限制在这里给出的细节之内,而是可以在所附的权利要求及其等同的范围内被修改。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号