一种自定义类的加载方法及装置制造方法及图纸

技术编号:12312404 阅读:80 留言:0更新日期:2015-11-11 20:13
本发明专利技术的实施例公开一种自定义类的加载方法及装置。方法包括:接收第一自定义类的加载请求,获取所述第一自定义类的类加载器链;在获取的所述类加载器链中,查找到加载所述第二自定义类的类加载器;提取所述第二自定义类的类加载器中预先设置的加载目录,并将提取的加载目录添加到所述类加载器链中用于加载所述第一自定义类的类加载器的加载路径中;删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器,得到更新的类加载器链;按照所述更新的类加载器链加载所述第一自定义类。应用本发明专利技术,可以有效扩展组件中自定义类功能。

【技术实现步骤摘要】

本专利技术涉及计算机通信技术,尤其涉及一种自定义类的加载方法及装置
技术介绍
java应用程序是一种可以撰写跨平台应用软件的面向对象的程序设计语言。类是java应用程序的组织单位,任何的java语句,都要写在类文件中。java继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。类加载器(classloader)是java中的加载器,其本身也是一个java类,包括应用程序classloader以及组件classloader。当java应用程序需要加载某一类时,需要通过classloader将待加载类的二进制信息加载至内存中。classloader拥有委托机制,除了根classloader,每一 classloader都会拥有自己的父级classloader。因而,当每一 classloader加载类时,会先将加载该类的任务委托给父级classloader,父级classloader再委托给上一父级,直至委托给根classloader。假定oriClassLoader 的父级 classloader 是 classLoaderl ;classLoaderl 的父级 clasloader 是 classLoader2 ;classLoader2 的父级 classloader 是 classLoader3 ;classLoader3 为根 classLoader,没有父级 classLoader。当oriclassloader根据委托机制加载具有继承关系的A类时:oriClassLoader直接将加载A类的任务依次通过classLoaderl以及classLoader2传达至classLoader3,classLoader3接收加载A类的任务后,由于没有父级classLoader,则在加载任务列表中查找是否包含A类,如果找到,加载A类并返回加载结果,如果未找到,将加载A类的任务再回传至classLoader2,classLoader2,classLoaderl进行同样的处理,直至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为本专利技术实施例提供的自定义类的加载装置具体结构示意图。【具体实施方式】下面结合附图对本专利技术实施例进行详细描述。应当明确,所描述的实施例仅仅是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本专利技术保本文档来自技高网
...

【技术保护点】
一种自定义类的加载方法,其特征在于,该方法包括:接收第一自定义类的加载请求,查询所述第一自定义类是否继承有第二自定义类,如果有,获取所述第一自定义类的类加载器链;在获取的所述类加载器链中,查找到加载所述第二自定义类的类加载器;提取所述第二自定义类的类加载器中预先设置的加载目录,并将提取的加载目录添加到所述类加载器链中用于加载所述第一自定义类的类加载器的加载路径中;删除所述类加载器链中除所述第一自定义类的类加载器之外的自定义类加载器,得到更新的类加载器链;按照所述更新的类加载器链加载所述第一自定义类。

【技术特征摘要】

【专利技术属性】
技术研发人员:孙文鸿
申请(专利权)人:北京金山安全软件有限公司
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1