CN104679572A - 基于预加载机制的插件支持方法 - Google Patents
基于预加载机制的插件支持方法 Download PDFInfo
- Publication number
- CN104679572A CN104679572A CN201510136737.0A CN201510136737A CN104679572A CN 104679572 A CN104679572 A CN 104679572A CN 201510136737 A CN201510136737 A CN 201510136737A CN 104679572 A CN104679572 A CN 104679572A
- Authority
- CN
- China
- Prior art keywords
- plug
- loader
- class
- type
- classloader
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明涉及基于预加载机制的插件支持方法,其包括以下步骤:1主程序启动并加载插件运行框架,由插件运行框架负责读取外部插件;2插件运行框架为外部插件启动独立类加载器,类加载器加载插件中的类型,并将类型保存到全局缓存中;3插件运行框架获取主程序当前的类加载器,将主程序当前类的加载器的父加载器替换为原父加载器的代理类,原父加载器的代理类会拦截所有发给原始类加载器的类型加载调用;4当主程序请求调用Class类型时,按照类型名称先从原父加载器中查找Class类型,若没有找到目标类型,再从全局缓存中匹配是否有对应的插件提供的类型,若匹配成功,则直接加载执行,反之,则抛出异常。
Description
技术领域
本发明属于通信领域,具体涉及基于预加载机制的插件支持方法。
背景技术
现代的软件应用程序一般都基于面向对象思想开发,为了执行程序代码,就需要装载相对应的类或接口。所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的class对象的过程。
一般来说,程序开发完后,其编译后的结果中所包含的对象类型是确定的,也就是说,其应用逻辑是确定的。如果希望不修改软件程序主体的情况下对软件功能进行加强,就需要系统具备在运行时动态装载外部对象类型的能力。
为了解决上述问题,就需要用到插件相关的技术,如图1所示,传统的实现方式主要有以下两种:
第一种:基于脚本等动态解释语言
此方法主要利用了脚本语言动态解释执行的能力,由于脚本语言不需要编译,因此无需提前构造类型,而是在每次调用时动态解释执行,对于开发者来说调整程序逻辑比较方便,但程序执行效率较差。这种方法被广泛应用于一些扩展需求不复杂的场景中。
第二种:基于特定插件接口进行扩展
此方式可以支持较复杂的业务逻辑,一般是编写一些遵循了某些特定规则的组件,主程序在启动或执行特定业务逻辑时通过静态调用或反射等方式装载该组件中的类型并执行相应代码,将暴露的扩展接口在内存中的地址传递给组件,组件则根据这些地址来调用插件接口,从而实现对主程序功能的增强。
在上述两种方法中,第一种方法虽然实现简单,但由于脚本是解释执行,运行效率较差,且脚本源代码对外暴露,只适用于进行一些简单的功能扩展。而第二种方法尽管运行效率高,但只能实现单向的接口调用,即可以让插件调用特定的主程序内部接口,但无法让主程序像调用内部组件一样任意调用插件的特定接口,这就对插件的扩展能力产生了限制,对于一些历史程序的迁移改造也造成了障碍。
在开发AVIDM 5.0产品全生命周期管理系统时,需要支持各种复杂的业务逻辑,对于扩展能力和插件的运行效率有较高要求,因此通过系统分析,综合以上两种方法的优点,实现了一种基于预装载技术的插件支持方法,该方法不仅满足复杂业务场景下对于扩展的需要,还解决了传统方式下无法支持主程序任意调用插件接口以及插件化改造对主程序改动较大的问题,从而大大节省了为主程序增加插件扩展能力所需的开发成本。
发明内容
发明目的:本发明针对上述现有技术存在的问题做出改进,即本发明公开了基于预加载机制的插件支持方法。
基于预加载机制的插件支持方法,包括以下步骤:
(1)、主程序启动同时加载插件运行框架,由插件运行框架负责读取所有外部插件;
(2)、插件运行框架为每个外部插件分别启动独立的类加载器,类加载器各自加载插件中的类型,并将加载后得到的类型保存到全局缓存中;
(3)插件运行框架获取主程序当前的类加载器,通过反射修改主程序当前的加载器的父加载器,将主程序当前类的加载器的父加载器替换为原父加载器的代理类,原父加载器的代理类会拦截所有发给原始类加载器的类型加载调用;
(4)、当主程序请求调用Class类型时,按照类型名称先从原父加载器中查找Class类型,若没有找到目标类型,再从全局缓存中匹配是否有对应的插件提供的类型,若匹配成功,则直接加载执行,反之,则抛出异常。
作为本发明中基于预加载机制的插件支持方法的一种优选方案,步骤(2)中的类加载器包括主类加载器、根类加载器和插件类加载器。
本发明提出的基于预加载机制的插件支持方法,通过反射等手段在主程序的类装载器中注入父装载器的代理类(代理模式是软件开发中常用的设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务),拦截主程序的类加载请求,首先从父装载器中装载类型,如果没有找到再从缓存中获取预先加载的子装载器中的类型,从而实现主程序与插件之间的双向互调用。
这种设计的好处是没有破坏传统类加载器的双亲委托机制,既能确保用户自定义的类装载器不能装载应该由父装载的可靠类,避免不可靠甚至恶意的代码代替本应该由父装载器装载的可靠代码,同时还满足了主程序加载插件中类型的需要。
通过这种类动态装载技术,能够在运行时刻动态地加载或者替换扩展功能逻辑,而不影响系统其他功能模块的正常运行。
有益效果:本发明公开了基于预加载机制的插件支持方法与装置,具有以下有益效果:
1.采用在插件启动时预加载插件内部类型和资源的方式,减少了系统运行时从插件压缩包中进行类型查找和读取的时间,加快了插件运行速度;
2.通过对线程上类加载器的拦截调用,在不破坏插件独立性的前提下,突破了传统插件类加载机制的限制,实现了插件容器外代码对插件内部类型和资源的访问;
3.该技术方法对于采用基于传统手段开发的应用程序完全透明,开发者无需对旧系统进行任何修改,就可以为其增加插件扩展能力,大大增强了系统的可扩展性。
附图说明
图1为传统的类加载机制的示意图;
图2为本发明公开的基于预加载机制的插件支持方法的示意图。
具体实施方式:
下面对本发明的具体实施方式详细说明。
如图2所示,基于预加载机制的插件支持方法,包括以下步骤:
(1)、主程序启动同时加载插件运行框架,由插件运行框架负责读取所有外部插件;
(2)、插件运行框架为每个外部插件分别启动独立的类加载器,类加载器各自加载插件中的类型,并将加载后得到的类型保存到全局缓存中;
(3)插件运行框架获取主程序当前的类加载器,通过反射修改主程序当前的加载器的父加载器,将主程序当前类的加载器的父加载器替换为原父加载器的代理类,原父加载器的代理类会拦截所有发给原始类加载器的类型加载调用;
(4)、当主程序请求调用Class类型时,按照类型名称先从原父加载器中查找Class类型,若没有找到目标类型,再从全局缓存中匹配是否有对应的插件提供的类型,若匹配成功,则直接加载执行,反之,则抛出异常。
本实施例中,步骤(2)中的类加载器包括主类加载器、根类加载器和插件类加载器。
上面对本发明的实施方式做了详细说明。但是本发明并不限于上述实施方式,在所属技术领域普通技术人员所具备的知识范围内,还可以在不脱离本发明宗旨的前提下做出各种变化。
Claims (2)
1.基于预加载机制的插件支持方法,其特征在于,包括以下步骤:
(1)、主程序启动同时加载插件运行框架,由插件运行框架负责读取所有外部插件;
(2)、插件运行框架为每个外部插件分别启动独立的类加载器,类加载器各自加载插件中的类型,并将加载后得到的类型保存到全局缓存中;
(3)插件运行框架获取主程序当前的类加载器,通过反射修改主程序当前的加载器的父加载器,将主程序当前类的加载器的父加载器替换为原父加载器的代理类,原父加载器的代理类会拦截所有发给原始类加载器的类型加载调用;
(4)、当主程序请求调用Class类型时,按照类型名称先从原父加载器中查找Class类型,若没有找到目标类型,再从全局缓存中匹配是否有对应的插件提供的类型,若匹配成功,则直接加载执行,反之,则抛出异常。
2.如权利要求1所述的基于预加载机制的插件支持方法,其特征在于,步骤(2)中的类加载器包括主类加载器、根类加载器和插件类加载器。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510136737.0A CN104679572B (zh) | 2015-03-26 | 2015-03-26 | 基于预加载机制的插件支持方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510136737.0A CN104679572B (zh) | 2015-03-26 | 2015-03-26 | 基于预加载机制的插件支持方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104679572A true CN104679572A (zh) | 2015-06-03 |
CN104679572B CN104679572B (zh) | 2017-09-22 |
Family
ID=53314669
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510136737.0A Active CN104679572B (zh) | 2015-03-26 | 2015-03-26 | 基于预加载机制的插件支持方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104679572B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105373396A (zh) * | 2015-08-14 | 2016-03-02 | 腾讯科技(深圳)有限公司 | 插件平台中的插件更新方法和装置 |
CN106201592A (zh) * | 2016-06-29 | 2016-12-07 | 北京小米移动软件有限公司 | 一种查找类的方法和装置 |
CN106339237A (zh) * | 2016-08-16 | 2017-01-18 | 税友软件集团股份有限公司 | 针对JavaEE领域WEB应用的插件加载框架及方法 |
CN107391202A (zh) * | 2017-07-27 | 2017-11-24 | 北京奇虎科技有限公司 | 一种插件前期绑定方法、装置和电子设备 |
WO2018103610A1 (zh) * | 2016-12-05 | 2018-06-14 | 腾讯科技(深圳)有限公司 | 一种插件加载方法及装置、终端、存储介质 |
CN110427198A (zh) * | 2018-04-27 | 2019-11-08 | 中兴通讯股份有限公司 | 应用程序的热修复方法、装置及终端、存储介质 |
CN110941459A (zh) * | 2019-11-20 | 2020-03-31 | 东软集团股份有限公司 | 调用Replugin插件的方法及装置 |
CN111552518A (zh) * | 2019-01-24 | 2020-08-18 | 阿里巴巴集团控股有限公司 | 一种启动应用的控件加载方法及装置 |
CN113805965A (zh) * | 2021-09-11 | 2021-12-17 | 济南浪潮数据技术有限公司 | 一种外部插件安装的方法、装置、设备及可读介质 |
CN117193874A (zh) * | 2023-09-05 | 2023-12-08 | 北京基调网络股份有限公司 | 插件处理方法、装置、存储介质及电子设备 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6513158B1 (en) * | 1999-11-15 | 2003-01-28 | Espial Group Inc. | Method and apparatus for running multiple java applications simultaneously |
US20050060698A1 (en) * | 2003-09-11 | 2005-03-17 | International Business Machines Corporation | Mechanism for loading plugin classes at an appropriate location in the class loader hierarchy |
CN1641569A (zh) * | 2004-01-06 | 2005-07-20 | 英业达股份有限公司 | Java小应用程序下插件功能的实现方法 |
US20090249327A1 (en) * | 2008-03-31 | 2009-10-01 | International Business Machines Corporation | Method for metering an extensible license for java applications |
CN102214109A (zh) * | 2010-04-08 | 2011-10-12 | 深圳市金蝶中间件有限公司 | 一种加载插件的方法及装置 |
CN102819438A (zh) * | 2011-06-08 | 2012-12-12 | 金蝶软件(中国)有限公司 | 一种热加载的方法、装置及信息系统 |
CN103970563A (zh) * | 2014-04-15 | 2014-08-06 | 四川长虹电器股份有限公司 | 动态加载安卓类的方法 |
CN104123151A (zh) * | 2013-04-28 | 2014-10-29 | 百度在线网络技术(北京)有限公司 | 移动终端中应用程序的插件管理方法、装置和移动终端 |
CN104360884A (zh) * | 2014-11-18 | 2015-02-18 | 久邦计算机技术(广州)有限公司 | 一种基于安卓系统的插件资源包加载方法 |
-
2015
- 2015-03-26 CN CN201510136737.0A patent/CN104679572B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6513158B1 (en) * | 1999-11-15 | 2003-01-28 | Espial Group Inc. | Method and apparatus for running multiple java applications simultaneously |
US20050060698A1 (en) * | 2003-09-11 | 2005-03-17 | International Business Machines Corporation | Mechanism for loading plugin classes at an appropriate location in the class loader hierarchy |
CN1641569A (zh) * | 2004-01-06 | 2005-07-20 | 英业达股份有限公司 | Java小应用程序下插件功能的实现方法 |
US20090249327A1 (en) * | 2008-03-31 | 2009-10-01 | International Business Machines Corporation | Method for metering an extensible license for java applications |
CN102214109A (zh) * | 2010-04-08 | 2011-10-12 | 深圳市金蝶中间件有限公司 | 一种加载插件的方法及装置 |
CN102819438A (zh) * | 2011-06-08 | 2012-12-12 | 金蝶软件(中国)有限公司 | 一种热加载的方法、装置及信息系统 |
CN104123151A (zh) * | 2013-04-28 | 2014-10-29 | 百度在线网络技术(北京)有限公司 | 移动终端中应用程序的插件管理方法、装置和移动终端 |
CN103970563A (zh) * | 2014-04-15 | 2014-08-06 | 四川长虹电器股份有限公司 | 动态加载安卓类的方法 |
CN104360884A (zh) * | 2014-11-18 | 2015-02-18 | 久邦计算机技术(广州)有限公司 | 一种基于安卓系统的插件资源包加载方法 |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105373396A (zh) * | 2015-08-14 | 2016-03-02 | 腾讯科技(深圳)有限公司 | 插件平台中的插件更新方法和装置 |
CN106201592A (zh) * | 2016-06-29 | 2016-12-07 | 北京小米移动软件有限公司 | 一种查找类的方法和装置 |
CN106339237B (zh) * | 2016-08-16 | 2019-11-12 | 税友软件集团股份有限公司 | 针对JavaEE领域WEB应用的插件加载框架及方法 |
CN106339237A (zh) * | 2016-08-16 | 2017-01-18 | 税友软件集团股份有限公司 | 针对JavaEE领域WEB应用的插件加载框架及方法 |
US11263027B2 (en) | 2016-12-05 | 2022-03-01 | Tencent Technology (Shenzhen) Company Limited | Plugin loading method and apparatus, terminal, and storage medium |
WO2018103610A1 (zh) * | 2016-12-05 | 2018-06-14 | 腾讯科技(深圳)有限公司 | 一种插件加载方法及装置、终端、存储介质 |
US10891141B2 (en) | 2016-12-05 | 2021-01-12 | Tencent Technology (Shenzhen) Company Limited | Plugin loading method and apparatus, terminal, and storage medium |
CN107391202B (zh) * | 2017-07-27 | 2020-12-08 | 北京奇虎科技有限公司 | 一种插件前期绑定方法、装置和电子设备 |
CN107391202A (zh) * | 2017-07-27 | 2017-11-24 | 北京奇虎科技有限公司 | 一种插件前期绑定方法、装置和电子设备 |
CN110427198A (zh) * | 2018-04-27 | 2019-11-08 | 中兴通讯股份有限公司 | 应用程序的热修复方法、装置及终端、存储介质 |
CN111552518A (zh) * | 2019-01-24 | 2020-08-18 | 阿里巴巴集团控股有限公司 | 一种启动应用的控件加载方法及装置 |
CN111552518B (zh) * | 2019-01-24 | 2023-04-07 | 阿里巴巴集团控股有限公司 | 一种启动应用的控件加载方法及装置 |
CN110941459A (zh) * | 2019-11-20 | 2020-03-31 | 东软集团股份有限公司 | 调用Replugin插件的方法及装置 |
CN113805965A (zh) * | 2021-09-11 | 2021-12-17 | 济南浪潮数据技术有限公司 | 一种外部插件安装的方法、装置、设备及可读介质 |
CN113805965B (zh) * | 2021-09-11 | 2023-12-29 | 济南浪潮数据技术有限公司 | 一种外部插件安装的方法、装置、设备及可读介质 |
CN117193874A (zh) * | 2023-09-05 | 2023-12-08 | 北京基调网络股份有限公司 | 插件处理方法、装置、存储介质及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN104679572B (zh) | 2017-09-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104679572A (zh) | 基于预加载机制的插件支持方法 | |
CN107688500B (zh) | 一种分布式任务处理方法、装置、系统及设备 | |
US20200167344A1 (en) | Method and device for writing service data in block chain system | |
CN107450979B (zh) | 一种区块链共识方法及装置 | |
CN108958796B (zh) | 业务请求处理方法及装置、业务请求处理系统 | |
US8924944B2 (en) | Implementation of distributed methods that support generic functions | |
CN108599973B (zh) | 一种日志关联方法、装置及设备 | |
US20200142674A1 (en) | Extracting web api endpoint data from source code | |
CN110795091B (zh) | 一种模块化路由解耦方法、存储介质、电子设备及系统 | |
US20230297352A1 (en) | Method for Starting Serverless Container and Related Device | |
US10303558B2 (en) | Checkpointing higher order query operators | |
US9207956B2 (en) | Class loading device for a java runtime environment, cluster system and method of executing a function | |
CN108681491B (zh) | 一种文件解耦方法及系统 | |
CN113987337A (zh) | 基于组件化动态编排的搜索方法、系统、设备及存储介质 | |
CN111143461A (zh) | 映射关系处理系统、方法和电子设备 | |
US10262054B2 (en) | Database and service upgrade without downtime | |
CN109857380B (zh) | 一种工作流文件编译方法及装置 | |
CN115033350A (zh) | 一种分布式事务的执行方法及装置 | |
CN113867776A (zh) | 中台应用的发布方法、装置、电子设备和存储介质 | |
CN110543351B (zh) | 数据处理方法以及计算机设备 | |
CN112650502A (zh) | 批处理任务处理方法、装置、计算机设备和存储介质 | |
CN112596780A (zh) | 一种业务执行的方法以及装置 | |
CN114385174A (zh) | 一种功能模块的编译方法、装置、设备和存储介质 | |
US11017032B1 (en) | Document recovery utilizing serialized data | |
US20230359440A1 (en) | Externally-initiated runtime type extension |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP01 | Change in the name or title of a patent holder | ||
CP01 | Change in the name or title of a patent holder |
Address after: 100094 No. 28, Yongfeng Road, Beijing, Haidian District Patentee after: Beijing Shenzhou Aerospace Software Technology Co.,Ltd. Address before: 100094 No. 28, Yongfeng Road, Beijing, Haidian District Patentee before: BEIJING SHENZHOU AEROSPACE SOFTWARE TECHNOLOGY Co.,Ltd. |