CN105045642B - 一种自定义类的加载方法及装置 - Google Patents
一种自定义类的加载方法及装置 Download PDFInfo
- Publication number
- CN105045642B CN105045642B CN201510548994.5A CN201510548994A CN105045642B CN 105045642 B CN105045642 B CN 105045642B CN 201510548994 A CN201510548994 A CN 201510548994A CN 105045642 B CN105045642 B CN 105045642B
- Authority
- CN
- China
- Prior art keywords
- self defined
- classloader
- defined class
- chain
- class
- 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.)
- Expired - Fee Related
Links
- 238000011068 loading method Methods 0.000 title claims abstract description 113
- 238000000034 method Methods 0.000 title claims abstract description 12
- 238000000605 extraction Methods 0.000 claims description 9
- 235000013399 edible fruits Nutrition 0.000 claims description 4
- 230000036316 preload Effects 0.000 claims description 4
- 230000006870 function Effects 0.000 description 18
- 238000010586 diagram Methods 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 5
- 239000000284 extract Substances 0.000 description 3
- 206010034719 Personality change Diseases 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 230000009975 flexible effect Effects 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Landscapes
- Stored Programmes (AREA)
Abstract
本发明的实施例公开一种自定义类的加载方法及装置。方法包括:接收第一自定义类的加载请求,获取所述第一自定义类的类加载器链;在获取的所述类加载器链中,查找到加载所述第二自定义类的类加载器;提取所述第二自定义类的类加载器中预先设置的加载目录,并将提取的加载目录添加到所述类加载器链中用于加载所述第一自定义类的类加载器的加载路径中;删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器,得到更新的类加载器链;按照所述更新的类加载器链加载所述第一自定义类。应用本发明,可以有效扩展组件中自定义类功能。
Description
技术领域
本发明涉及计算机通信技术,尤其涉及一种自定义类的加载方法及装置。
背景技术
java应用程序是一种可以撰写跨平台应用软件的面向对象的程序设计语言。类是java应用程序的组织单位,任何的java语句,都要写在类文件中。java继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
类加载器(classloader)是java中的加载器,其本身也是一个java类,包括应用程序classloader以及组件classloader。当java应用程序需要加载某一类时,需要通过classloader将待加载类的二进制信息加载至内存中。classloader拥有委托机制,除了根classloader,每一classloader都会拥有自己的父级classloader。因而,当每一classloader加载类时,会先将加载该类的任务委托给父级classloader,父级classloader再委托给上一父级,直至委托给根classloader。
假定oriClassLoader的父级classloader是classLoader1;
classLoader1的父级clasloader是classLoader2;
classLoader2的父级classloader是classLoader3;
classLoader3为根classLoader,没有父级classLoader。
当oriclassloader根据委托机制加载具有继承关系的A类时:
oriClassLoader直接将加载A类的任务依次通过classLoader1以及classLoader2传达至classLoader3,classLoader3接收加载A类的任务后,由于没有父级classLoader,则在加载任务列表中查找是否包含A类,如果找到,加载A类并返回加载结果,如果未找到,将加载A类的任务再回传至classLoader2,classLoader2,classLoader1进行同样的处理,直至oriClassLoader接收加载A类的任务后,查找A类,如果找到,加载A类并返回加载结果,如果未找到,抛出异常,表示加载A类失败。
在加载A类完成之后,发现A类拥有父类或者实现java接口(继承一个父类或者实现一个java接口),根据与加载A类相似的委托机制,oriClassLoader相应尝试去加载A类的父类或者java接口,其中,父类与java接口也是类,如果加载A类的父类或者java接口成功,则对加载的父类或者java接口进行校验,即校验加载出的具有继承关系的两个自定义类是否属于不同的文件类型,如果是,则抛出加载错误,如果是,加载组件中的A类成功。
一java应用程序由多个组件组成,每个组件实现特定的功能,例如,有的组件可以作为Android操作系统进入java应用程序的入口点,各个组件协同合作,共同组成一个完整的java应用程序,这样,通过将(java)程序分割成多个组件,各组件可以独自更新,以达到升级android应用功能而无需升级android应用的目的,在后续需要加载某一组件时,与加载具有继承关系的A类的流程相类似。这样,在上述示例中,如果A类是一个仅属于组件的类,同时继承了一个父类,记为B类,假设B类在组件和应用程序中都存在,以应用程序classloader作为组件classloader的父级classloader,由于加载出的A类与加载出的B类属于不同的文件类型,因而抛出错误,导致加载组件失败,组件加载成功率低。
为了提升组件的加载成功率,在进行组件设计时,程序员应尽量避免A类继承B类,从而可以避免加载组件的类加载器与加载组件继承的父类的类加载器不属于同一classloader的情形,以提升组件加载的成功率。但该方法,限制了组件设计的灵活性,给组件中加入自定义类的编码带来不便,并影响组件中自定义类功能的扩展,限制了组件个性化功能的实现。
发明内容
有鉴于此,本发明实施例提供一种自定义类的加载方法及装置,有效扩展组件中自定义类功能,提升组件中自定义类设计的灵活性。
为达到上述目的,本发明的实施例采用如下技术方案:
一方面,本发明实施例提供一种自定义类的加载方法,包括:
接收第一自定义类的加载请求,查询所述第一自定义类是否继承有第二自定义类,如果有,获取所述第一自定义类的类加载器链;
在获取的所述类加载器链中,查找到加载所述第二自定义类的类加载器;
提取所述第二自定义类的类加载器中预先设置的加载目录,并将提取的加载目录添加到所述类加载器链中用于加载所述第一自定义类的类加载器的加载路径中;
删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器,得到更新的类加载器链;
按照所述更新的类加载器链加载所述第一自定义类。
另一方面,本发明实施例提供一种自定义类的加载装置,包括:继承关系查询模块、加载查询模块、目录添加模块、类加载器链更新模块以及组件加载模块,其中,
继承关系查询模块,用于接收第一自定义类的加载请求,查询所述第一自定义类是否继承有第二自定义类,如果有,获取所述第一自定义类的类加载器链;
加载查询模块,用于在获取的所述类加载器链中,查找到加载所述第二自定义类的类加载器;
目录添加模块,用于提取所述第二自定义类的类加载器中预先设置的加载目录,并将提取的加载目录添加到所述类加载器链中用于加载所述第一自定义类的类加载器的加载路径中;
类加载器链更新模块,用于删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器,得到更新的类加载器链;
组件加载模块,用于按照所述更新的类加载器链加载所述第一自定义类。
本发明实施例提供的自定义类的加载装置,继承关系查询模块在加载组件的自定义类时,确定待加载的自定义类继承了第二自定义类,加载查询模块查找到加载所述第二自定义类的类加载器,目录添加模块将加载第二自定义类的类加载器中的/vendor/lib目录以及/system/lib目录添加到加载组件的自定义类的类加载器的加载路径中,类加载器链更新模块通过删除组件的自定义类链上除链头之外的所有可加载自定义类的类加载器以更新组件的自定义类链,组件加载模块按照更新的组件的自定义类链加载组件,从而能够使得加载自定义类以及组件和应用程序中共有的自定义类的类加载器属于同一类加载器,有效扩展了组件中自定义类功能,提升了组件中自定义类设计的灵活性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1为本发明实施例提供的自定义类的加载方法流程示意图;
图2为本发明实施例提供的自定义类的加载装置结构示意图;
图3为本发明实施例提供的自定义类的加载装置具体结构示意图。
具体实施方式
下面结合附图对本发明实施例进行详细描述。
应当明确,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
图1为本发明实施例提供的自定义类的加载方法流程示意图。参见图1,该方法包括:
步骤101,接收第一自定义类的加载请求,查询所述第一自定义类是否继承有第二自定义类,如果有,获取所述第一自定义类的类加载器链;
本步骤中,作为一可选实施例,第一自定义类的为组件自定义类,第二自定义类为应用程序自定义类,应用程序自定义类可以存在于应用程序以及所述组件中,该应用程序为组件所属的应用程序。具体来说,第二自定义类可以是一个父类或者实现一个java接口。
本发明实施例中,由于类的继承关系非常普遍,在进行组件设计时,通过自定义类的继承关系,可以降低自定义类的编码,扩展组件中自定义类的功能,提升组件设计的灵活性。
本发明实施例中,如果第一自定义类继承了一个父类或者实现一个java接口,且该父类存在于应用程序以及组件中,则确定第一自定义类继承有存在于应用程序以及所述组件中的第二自定义类。
实际应用中,每一自定义类具有一类加载器链,关于获取自定义类的类加载器链为公知技术,在此略去详述。
步骤102,在获取的所述类加载器链中,查找到加载所述第二自定义类的类加载器;
本步骤中,作为一可选实施例,查找到加载所述第二自定义类的类加载器包括:
A11,提取第一自定义类的类加载器链中的所述第一自定义类的类加载器,将预加载第二自定义类的任务请求,从链头至所述第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
本步骤中,链尾对应的类加载器一般为系统类加载器,且为根类加载器,不具有父级类加载器。
A12,所述链尾对应的类加载器在加载任务列表中查找是否包含所述第二自定义类,如果包含,所述链尾对应的类加载器为所述第二自定义类的类加载器,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第二自定义类,并将包含所述第二自定义类的加载任务列表对应的自定义类加载器作为所述第二自定义类的类加载器。
本步骤中,如果所述第一自定义类的类加载器查询到加载任务列表中没有包含所述第二自定义类,则加载组件中的自定义类失败。
步骤103,提取所述第二自定义类的类加载器中预先设置的加载目录,并将提取的加载目录添加到所述类加载器链中用于加载所述第一自定义类的类加载器的加载路径中;
本步骤中,作为一可选实施例,预先设置的加载目录包括:/vendor/lib目录以及/system/lib目录。其中,/vendor/lib目录拥有应用程序厂商定制的底层系统功能的文件,/system/lib目录拥有操作系统标准的底层系统功能的文件。
步骤104,删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器,得到更新的类加载器链;
本步骤中,如果第一自定义类是一个仅属于组件的类,同时继承了一个在组件和应用程序中都存在的父类,即第二自定义类,则作为一可选实施例,第一自定义类的类加载器链中,从链头至链尾,依序包括:组件classloader、应用程序classloader以及系统类classloader,其中,系统类classloader为应用程序classloader的父级classloader,应用程序classloader为组件classloader的父级classloader。则依据现有的委托技术方案,由组件classloader加载第一自定义类,应用程序classloader加载第二自定义类,使得加载第一自定义类的类加载器与加载第二自定义类的类加载器不属于同一classloader,因而抛出错误。
本发明实施例中,由于第二自定义类在组件和应用程序中都存在,因而,理论上可由组件classloader或应用程序classloader进行加载,但基于现有第一自定义类的类加载器链以及加载委托机制,需要由应用程序classloader进行加载。因而,如果考虑删除所述类加载器链中的应用程序classloader,则使得第一自定义类的类加载器链中,从链头至链尾只包括:组件classloader以及系统类classloader,这样,在加载第一自定义类以及第二自定义类时,依据委托加载机制,均由组件classloader进行加载,使得加载第一自定义类的类加载器与加载第二自定义类的类加载器属于同一classloader,因而,即使组件中的自定义类继承组件和应用程序中共有的自定义类,使得组件与应用程序拥有相同的自定义类,不会导致自定义类冲突,也不会影响正常的编码,能够加载成功,无需避免组件中的类去继承组件和应用程序中共有的类以避免类冲突。
举例来说,A类为组件自定义类,继承一个在组件和应用程序中都存在的父类(B类)或者实现一个java接口,A类加载器链中,包括:classloaderA、classloaderB以及classloaderC,其中,classloaderA为组件classloader,classloaderB为应用程序classloader,classloaderC为系统类classloader。本发明实施例中,考虑改变A类加载器链中classloaderA的父级classloader,将classloaderB的父级classloader作为classloaderA的父级classloader,并将classloaderB从A类加载器链中删除,而非将classloaderB作为classloaderA的父级classloader,由于修改后的classloaderA的父级classloader为根classloader(classloaderC),从而能够实现由classloaderA加载A类和B类。
实际应用中,可以设置classloaderB的父级classloader(classloaderC)为负责加载java应用程序的核心库的classloader,即修改后的A类加载器链中,classloaderA的父级classloader为负责加载java应用程序的核心库的classloader。也就是说,在以classloaderA为链头的A类加载器链中,删除classloaderB节点,即:
现有的A类加载器链:classloaderA→classloaderB→classloaderC;
修改后的A类加载器链:classloaderA→classloaderC。
本发明实施例中,在以classloaderA为链头的classloader链中,删除classloaderB节点后,需要分析classloaderB负责加载的内容在删除classloaderB后,对classloaderA正常工作的影响,经过分析可以发现,classloaderB负责加载的内容包括如下四个方面:
1,加载应用程序的代码,该代码为程序员编写的代码。
2,根据实际需求添加应用程序的库文件。
3,加载/vendor/lib目录,该目录中,拥有应用程序厂商定制的底层系统功能的文件。
4,加载/system/lib目录,该目录中,拥有操作系统标准的底层系统功能的文件。
本发明实施例中,分析缺少classloaderB负责加载的内容对classloaderA正常工作(加载组件代码)的影响,影响如下:
a,由于只需要classloaderA去加载组件代码,无须关心应用程序代码,因而,在以classloaderA为链头的classloader链中删除classloaderB节点,只是不能实现应用程序代码的加载,而该加载不是必须的,因而,缺少该classloaderB负责加载的应用程序代码内容,不会对加载组件代码产生影响。
b,基于与a相同的分析,由于只需要关心组件代码,缺少该classloaderB负责根据实际需求添加应用程序的库文件的内容,对于实现组件代码的加载不是必须的,不会对加载组件代码产生影响。
c,由于组件功能可能涉及应用程序厂商定制的底层系统功能,如果缺少该classloaderB加载/vendor/lib目录的内容,可能导致无法正常调用组件功能,需要解决该技术问题。
d,基于与c相同的分析,,由于组件功能可能涉及系统标准的底层系统功能,如果缺少该classloaderB加载/system/lib目录的内容,可能导致无法正常调用组件功能,需要解决该技术问题。
通过上述分析,如果仅仅简单地将classloaderB节点从classloader链中删除,可能会导致组件无法正常使用,因而,本发明实施例中,需要将/vendor/lib目录以及/system/lib目录添加到classloaderA的加载路径中,这样,可以完成classloader链的加载流程并且使得classloaderA能够正常运行。因而,在删除classloaderB之前,需要将classloaderB的/vendor/lib目录以及/system/lib目录添加到classloaderA的加载路径中,以避免对加载组件代码的影响。
步骤105,按照所述更新的类加载器链加载所述第一自定义类。
本步骤中,作为一可选实施例,按照所述更新的类加载器链加载所述第一自定义类包括:
B11,提取所述更新的第一自定义类的类加载器链中的所述第一自定义类的类加载器,将加载第一自定义类的任务请求,从所述第一自定义类的类加载器至所述更新的第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
B12,所述更新的第一自定义类的类加载器链的链尾对应的类加载器在加载任务列表中查找是否包含所述第一自定义类,如果包含,加载所述第一自定义类并返回加载结果,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第一自定义类,并从包含所述第一自定义类的加载任务列表对应的自定义类加载器加载所述第一自定义类并返回加载结果;
B13,接收加载结果信息,提取所述更新的第一自定义类的类加载器链中的所述第一自定义类的类加载器,将加载第二自定义类的任务请求,从所述第一自定义类的类加载器至所述更新的第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
B14,所述更新的第一自定义类的类加载器链的链尾对应的类加载器在加载任务列表中查找是否包含所述第二自定义类,如果包含,加载所述第二自定义类并返回加载结果,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第二自定义类,并从包含所述第二自定义类的加载任务列表对应的自定义类加载器加载所述第二自定义类并返回加载结果。
本发明实施例中,在加载组件的自定义类时,如果待加载的自定义类继承了类型不同的另一自定义类,则可以通过删除classloader链上除链头之外的所有可加载自定义类的类加载器,并将加载另一自定义类的类加载器中的/vendor/lib目录以及/system/lib目录添加到第一自定义类加载器的加载路径中,以重新定义classloader链,从而能够使得加载第一自定义类的类加载器与加载第二自定义类的类加载器属于同一classloader,使得组件与应用程序就算拥有相同的自定义类,即组件中的自定义类继承组件和应用程序中共有的自定义类,也不会影响正常的编码,用以有效解决使用组件中的类冲突问题,有效扩展组件中自定义类功能,提升组件中自定义类设计的灵活性。
图2为本发明实施例提供的自定义类的加载装置结构示意图。参见图2,该装置包括:继承关系查询模块201、加载查询模块202、目录添加模块203、类加载器链更新模块204以及组件加载模块205,其中,
继承关系查询模块201,用于接收第一自定义类的加载请求,查询所述第一自定义类是否继承有第二自定义类,如果有,获取所述第一自定义类的类加载器链;
本发明实施例中,作为一可选实施例,第一自定义类为组件自定义类,第二自定义类为应用程序自定义类,第二自定义类存在于应用程序以及所述组件中,所述应用程序为组件所属的应用程序。
加载查询模块202,用于在获取的所述类加载器链中,查找到加载所述第二自定义类的类加载器;
目录添加模块203,用于提取所述第二自定义类的类加载器中预先设置的加载目录,并将提取的加载目录添加到所述类加载器链中用于加载所述第一自定义类的类加载器的加载路径中;
本发明实施例中,作为一可选实施例,预先设置的加载目录包括:/vendor/lib目录以及/system/lib目录。
类加载器链更新模块204,用于删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器,得到更新的类加载器链;
本发明实施例中,在删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器后,将所述第一自定义类的类加载器的父级类加载器设置为链中第一个非自定义类加载器。
组件加载模块205,用于按照所述更新的类加载器链加载所述第一自定义类。
图3为本发明实施例提供的自定义类的加载装置具体结构示意图。参见图3,该装置包括:继承关系查询模块201、加载查询模块202、目录添加模块203、类加载器链更新模块204以及组件加载模块205,其中,
加载查询模块202包括:预加载任务请求单元31以及第二自定义类的类加载器获取单元32,其中,
预加载任务请求单元31,用于提取第一自定义类的类加载器链中的所述第一自定义类的类加载器,将预加载第二自定义类的任务请求,从链头至所述第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
第二自定义类的类加载器获取单元32,用于在所述链尾对应的类加载器在加载任务列表中查找是否包含所述第二自定义类,如果包含,所述链尾对应的类加载器为所述第二自定义类的类加载器,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第二自定义类,并将包含所述第二自定义类的加载任务列表对应的自定义类加载器作为所述第二自定义类的类加载器。
本发明实施例中,作为一可选实施例,组件加载模块205包括:第一自定义类加载任务请求单元41、第一自定义类加载单元42、第二自定义类加载任务请求单元43以及第二自定义类加载单元44,其中,
第一自定义类加载任务请求单元41,用于提取所述更新的第一自定义类的类加载器链中的所述第一自定义类的类加载器,将加载第一自定义类的任务请求,从所述第一自定义类的类加载器至所述更新的第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
第一自定义类加载单元42,用于在所述更新的第一自定义类的类加载器链的链尾对应的类加载器在加载任务列表中查找是否包含所述第一自定义类,如果包含,加载所述第一自定义类并返回加载结果,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第一自定义类,并从包含所述第一自定义类的加载任务列表对应的自定义类加载器加载所述第一自定义类并返回加载结果;
第二自定义类加载任务请求单元43,用于接收加载结果信息,提取所述更新的第一自定义类的类加载器链中的所述第一自定义类的类加载器,将加载第二自定义类的任务请求,从所述第一自定义类的类加载器至所述更新的第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
第二自定义类加载单元44,用于在所述更新的第一自定义类的类加载器链的链尾对应的类加载器在加载任务列表中查找是否包含所述第二自定义类,如果包含,加载所述第二自定义类并返回加载结果,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第二自定义类,并从包含所述第二自定义类的加载任务列表对应的自定义类加载器加载所述第二自定义类并返回加载结果。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
Claims (10)
1.一种自定义类的加载方法,其特征在于,该方法包括:
接收第一自定义类的加载请求,查询所述第一自定义类是否继承有第二自定义类,如果有,获取所述第一自定义类的类加载器链;
在获取的所述类加载器链中,查找到加载所述第二自定义类的类加载器;
提取所述第二自定义类的类加载器中预先设置的加载目录,并将提取的加载目录添加到所述类加载器链中用于加载所述第一自定义类的类加载器的加载路径中;
删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器,得到更新的类加载器链;
按照所述更新的类加载器链加载所述第一自定义类。
2.根据权利要求1所述的方法,其特征在于,第一自定义类为组件自定义类,所述第二自定义类为应用程序自定义类,所述应用程序为所述组件所属的应用程序,所述应用程序自定义类存在于所述应用程序以及所述组件中。
3.根据权利要求1所述的方法,其特征在于,所述查找到加载所述第二自定义类的类加载器包括:
提取第一自定义类的类加载器链中的所述第一自定义类的类加载器,将预加载第二自定义类的任务请求,从链头至所述第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
所述链尾对应的类加载器在加载任务列表中查找是否包含所述第二自定义类,如果包含,所述链尾对应的类加载器为所述第二自定义类的类加载器,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第二自定义类,并将包含所述第二自定义类的加载任务列表对应的自定义类加载器作为所述第二自定义类的类加载器。
4.根据权利要求1所述的方法,其特征在于,所述预先设置的加载目录包括:/vendor/lib目录以及/system/lib目录。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述按照所述更新的类加载器链加载所述第一自定义类包括:
提取更新的第一自定义类的类加载器链中的所述第一自定义类的类加载器,将加载第一自定义类的任务请求,从所述第一自定义类的类加载器至所述更新的第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
所述更新的第一自定义类的类加载器链的链尾对应的类加载器在加载任务列表中查找是否包含所述第一自定义类,如果包含,加载所述第一自定义类并返回加载结果,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第一自定义类,并从包含所述第一自定义类的加载任务列表对应的自定义类加载器加载所述第一自定义类并返回加载结果;
接收加载结果信息,提取所述更新的第一自定义类的类加载器链中的所述第一自定义类的类加载器,将加载第二自定义类的任务请求,从所述第一自定义类的类加载器至所述更新的第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
所述更新的第一自定义类的类加载器链的链尾对应的类加载器在加载任务列表中查找是否包含所述第二自定义类,如果包含,加载所述第二自定义类并返回加载结果,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第二自定义类,并从包含所述第二自定义类的加载任务列表对应的自定义类加载器加载所述第二自定义类并返回加载结果。
6.一种自定义类的加载装置,其特征在于,该装置包括:继承关系查询模块、加载查询模块、目录添加模块、类加载器链更新模块以及组件加载模块,其中,
继承关系查询模块,用于接收第一自定义类的加载请求,查询所述第一自定义类是否继承有第二自定义类,如果有,获取所述第一自定义类的类加载器链;
加载查询模块,用于在获取的所述类加载器链中,查找到加载所述第二自定义类的类加载器;
目录添加模块,用于提取所述第二自定义类的类加载器中预先设置的加载目录,并将提取的加载目录添加到所述类加载器链中用于加载所述第一自定义类的类加载器的加载路径中;
类加载器链更新模块,用于删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器,得到更新的类加载器链;
组件加载模块,用于按照所述更新的类加载器链加载所述第一自定义类。
7.根据权利要求6所述的装置,其特征在于,所述第一自定义类为组件自定义类,第二自定义类为应用程序自定义类,第二自定义类存在于应用程序以及所述组件中,所述应用程序为组件所属的应用程序。
8.根据权利要求6所述的装置,其特征在于,所述加载查询模块包括:预加载任务请求单元以及第二自定义类的类加载器获取单元,其中,
预加载任务请求单元,用于提取第一自定义类的类加载器链中的所述第一自定义类的类加载器,将预加载第二自定义类的任务请求,从链头至所述第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
第二自定义类的类加载器获取单元,用于在所述链尾对应的类加载器在加载任务列表中查找是否包含所述第二自定义类,如果包含,所述链尾对应的类加载器为所述第二自定义类的类加载器,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第二自定义类,并将包含所述第二自定义类的加载任务列表对应的自定义类加载器作为所述第二自定义类的类加载器。
9.根据权利要求6所述的装置,其特征在于,所述组件加载模块包括:第一自定义类加载任务请求单元、第一自定义类加载单元、第二自定义类加载任务请求单元以及第二自定义类加载单元,其中,
第一自定义类加载任务请求单元,用于提取更新的第一自定义类的类加载器链中的所述第一自定义类的类加载器,将加载第一自定义类的任务请求,从所述第一自定义类的类加载器至所述更新的第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
第一自定义类加载单元,用于在所述更新的第一自定义类的类加载器链的链尾对应的类加载器在加载任务列表中查找是否包含所述第一自定义类,如果包含,加载所述第一自定义类并返回加载结果,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第一自定义类,并从包含所述第一自定义类的加载任务列表对应的自定义类加载器加载所述第一自定义类并返回加载结果;
第二自定义类加载任务请求单元,用于接收加载结果信息,提取所述更新的第一自定义类的类加载器链中的所述第一自定义类的类加载器,将加载第二自定义类的任务请求,从所述第一自定义类的类加载器至所述更新的第一自定义类的类加载器链的链尾的方向,依序传递至链尾对应的类加载器;
第二自定义类加载单元,用于在所述更新的第一自定义类的类加载器链的链尾对应的类加载器在加载任务列表中查找是否包含所述第二自定义类,如果包含,加载所述第二自定义类并返回加载结果,如果未包含,从所述链尾对应的类加载器至所述第一自定义类的类加载器的方向,依序查询相应的加载任务列表中查找是否包含所述第二自定义类,并从包含所述第二自定义类的加载任务列表对应的自定义类加载器加载所述第二自定义类并返回加载结果。
10.根据权利要求6至9任一项所述的装置,其特征在于,所述预先设置的加载目录包括:/vendor/lib目录以及/system/lib目录。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510548994.5A CN105045642B (zh) | 2015-08-31 | 2015-08-31 | 一种自定义类的加载方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510548994.5A CN105045642B (zh) | 2015-08-31 | 2015-08-31 | 一种自定义类的加载方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105045642A CN105045642A (zh) | 2015-11-11 |
CN105045642B true CN105045642B (zh) | 2018-09-25 |
Family
ID=54452206
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510548994.5A Expired - Fee Related CN105045642B (zh) | 2015-08-31 | 2015-08-31 | 一种自定义类的加载方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105045642B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107133055B (zh) * | 2017-06-07 | 2020-04-24 | 百卓网络科技有限公司 | 一种基于ClassLoader实现定制开发的方法 |
CN107656775A (zh) * | 2017-10-18 | 2018-02-02 | 国云科技股份有限公司 | 一种基于ClassLoader的自定义类查找方法 |
CN109784039B (zh) * | 2018-11-28 | 2022-04-19 | 杭州天宽科技有限公司 | 移动终端安全运行空间的构建方法、电子设备、存储介质 |
CN110427224B (zh) * | 2019-07-15 | 2022-04-08 | 山东中创软件商用中间件股份有限公司 | 一种ejb模块加载方法、装置、服务器及可读存储介质 |
CN112631685B (zh) * | 2020-12-30 | 2024-04-12 | 中国农业银行股份有限公司 | 一种类加载方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101105757A (zh) * | 2007-08-31 | 2008-01-16 | 金蝶软件(中国)有限公司 | 一种类装载隔离的方法及一种类装载隔离的装置 |
CN101126988A (zh) * | 2007-10-11 | 2008-02-20 | 金蝶软件(中国)有限公司 | 一种类文件装载方法和系统 |
CN102073525A (zh) * | 2011-01-20 | 2011-05-25 | 中兴通讯股份有限公司 | 基于Java平台的Web业务系统的动态升级方法及装置 |
CN102567033A (zh) * | 2010-12-14 | 2012-07-11 | 北京大学 | 基于嵌入式实时Java虚拟机的预先类加载方法及装置 |
CN104160375A (zh) * | 2012-03-01 | 2014-11-19 | 日本电气株式会社 | 系统构建过程生成设备、系统构建过程生成方法及其程序 |
-
2015
- 2015-08-31 CN CN201510548994.5A patent/CN105045642B/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101105757A (zh) * | 2007-08-31 | 2008-01-16 | 金蝶软件(中国)有限公司 | 一种类装载隔离的方法及一种类装载隔离的装置 |
CN101126988A (zh) * | 2007-10-11 | 2008-02-20 | 金蝶软件(中国)有限公司 | 一种类文件装载方法和系统 |
CN102567033A (zh) * | 2010-12-14 | 2012-07-11 | 北京大学 | 基于嵌入式实时Java虚拟机的预先类加载方法及装置 |
CN102073525A (zh) * | 2011-01-20 | 2011-05-25 | 中兴通讯股份有限公司 | 基于Java平台的Web业务系统的动态升级方法及装置 |
CN104160375A (zh) * | 2012-03-01 | 2014-11-19 | 日本电气株式会社 | 系统构建过程生成设备、系统构建过程生成方法及其程序 |
Also Published As
Publication number | Publication date |
---|---|
CN105045642A (zh) | 2015-11-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105045642B (zh) | 一种自定义类的加载方法及装置 | |
US20130198730A1 (en) | Update systems responsive to ongoing processing at a storage system | |
CN111258680B (zh) | 资源加载方法和装置、存储介质及电子装置 | |
CN103649907A (zh) | 高度并发处理任务的记录和执行 | |
US8856740B2 (en) | Implementing multiple versions of a plug-in concurrently | |
CN111142971A (zh) | 一种适应传统应用云化的云平台应用就绪检查方法 | |
CN102339219A (zh) | 用于支持面向对象脚本工具的系统和方法 | |
US11301221B2 (en) | Rapid code compiling system | |
US20210224084A1 (en) | Logging of scripts executed in an information technology workflow orchestration system | |
CN103631712B (zh) | 一种基于内存管理的模式化软件关键行为跟踪方法 | |
CN106850650B (zh) | 用于游戏客户端访问数据的方法及客户端游戏系统 | |
CN104168250A (zh) | 基于cgi框架的业务流程控制方法及装置 | |
US20120290596A1 (en) | Stabilized binary differencing | |
CN115794202A (zh) | 一种数据配置方法及引擎、档案系统、计算机存储介质 | |
CN109582382B (zh) | 配置信息的加载方法、装置、存储介质及终端设备 | |
CN107220044B (zh) | 基于元模型驱动业务对象的方法和装置 | |
CN112069189B (zh) | 多层级映射表格的更新方法、系统、终端设备及存储介质 | |
CN111930363B (zh) | 区块接口代码生成方法、及装置 | |
CN109032592A (zh) | 一种软件代码互相共享的方法 | |
US20160179573A1 (en) | Method for providing mainframe style batch job processing on a modern computer system | |
CN103838575A (zh) | 一种基于extjs框架的插件式页面定制实现方法 | |
CN116466953A (zh) | 组件化的前端开发方法、装置、计算机设备和存储介质 | |
CN105630526A (zh) | 脚本的加载控制方法及装置 | |
CN114691496A (zh) | 单元测试方法、装置、计算设备及介质 | |
JP5972455B2 (ja) | 情報を削除する方法 |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180925 |