类加载方法及类加载器与流程

文档序号:12824454阅读:273来源:国知局
类加载方法及类加载器与流程
本发明涉及计算机领域,尤其涉及一种类加载方法及类加载器。
背景技术
:宿主程序是用于供插件运行的载体,同时也指定了插件的接入规范。插件是一种程序模块,即是指符合服务平台的接入规范,能够运行于服务平台的,并且非服务平台本身所必须的功能或者业务模块。其中,插件与宿主程序可以打包在不同的安卓安装包(apk,androidpackage)中。现有技术中,每个apk都可以包括一个库(lib,library),lib中包括类的定义。当插件的类加载器需要加载一个类时:该类加载器首先会通知该类加载器的父加载器加载该类;当该父加载器在宿主程序的lib中查找到该类时,根据宿主程序的lib中的该类的定义完成该类的加载,并将该类的对象返回给该类加载器;当该父加载器在宿主程序的lib中未查找到该类时,将未找到该类的查找结果返回给该类加载器,由该类加载器完成该类的加载;当该类加载器收到该父加载器返回的该类的对象,且该类加载器确定插件的lib中也包括了该类的定义时,会出现类重复加载的错误。因此,现有技术中存在插件的lib和宿主程序的lib中不能包括相同的类,而导致应用程序开发不便的问题。技术实现要素:本发明提供一种类加载方法及类加载器,用以解决现有技术中插件的lib和宿主程序的lib中不能包括相同的类,而导致应用程序开发不便的问题。本发明提供一种类加载方法,包括:第一类加载器在插件的lib中查找第一类;其中,所述插件包括所述第 一类加载器;若所述第一类加载器在所述lib中查找到所述第一类,则使用所述lib中所述第一类的定义,对所述第一类进行加载。可选的,在本发明一实施例中,所述第一类加载器在插件的lib中查找所述第一类之后,还包括:若所述第一类加载器在所述lib中未查找到所述第一类,则通知第二类加载器对所述第一类进行加载;其中,所述第二类加载器为所述第一类加载器的父加载器。可选的,在本发明一实施例中,所述第一类加载器在插件的lib中查找第一类之前,或者所述第一类加载器在插件的lib中查找第一类之后,还包括:所述第一类加载器将所述lib中定义的所有类,在所述第二类加载器中进行注册。可选的,在本发明一实施例中,所述第一类加载器将所述lib中定义的所有类,在所述第二类加载器中进行注册,包括:所述第一类加载器将所述lib中定义的所有类的类名与所述插件的路径的对应关系,添加到所述第二类加载器的类列表。可选的,在本发明一实施例中,所述第一类加载器为dexclassloader,所述第二类加载器为pathclassloader。本发明提供一种类加载器,所述类加载器为第一类加载器,所述类加载器包括:查找模块,用于在插件的lib中查找第一类;其中,所述插件包括所述类加载器;加载模块,用于若所述查找模块在所述lib中查找到所述第一类,则使用所述lib中所述第一类的定义,对所述第一类进行加载。可选的,在本发明一实施例中,还包括:通知模块,用于若所述查找模块在所述lib中未查找到所述第一类,则通知第二类加载器对所述第一类进行加载;其中,所述第二类加载器为所述第一类加载器的父加载器。可选的,在本发明一实施例中,还包括:注册模块,用于将所述lib中 定义的所有类,在所述第二类加载器中进行注册。可选的,在本发明一实施例中,所述注册模块,具体用于将所述lib中定义的所有类的类名与所述插件的路径的对应关系,添加到所述第二类加载器的类列表。可选的,在本发明一实施例中,所述第一类加载器为dexclassloader,所述第二类加载器为pathclassloader。本发明提供一种类加载方法及类加载器;通过当第一类加载器需要加载第一类时,在插件的lib中查找第一类;若在所述lib中找到所述第一类,则使用所述lib中所述第一类的定义,对所述第一类进行加载;使得当插件的lib和宿主程序的lib中都包括第一类时,不会出现插件的类加载器收到该类加载器的父加载器返回的该类的对象,且插件的类加载器确定插件的lib中也包括了该类的定义的场景;因此,也不会出现类重复加载的错误;使得插件的lib和宿主程序的lib中可以包含相同的类,应用程序的开发更加灵活、方便。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本发明类加载方法实施例一的流程图;图2为本发明类加载方法实施例二的流程图;图3为本发明类加载方法实施例三的流程图;图4为本发明类加载器实施例一的结构示意图;图5为本发明类加载器实施例二的结构示意图。具体实施方式为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。图1为本发明类加载方法实施例一的流程图;如图1所示,本实施例的方法可以包括:步骤101、第一类加载器在插件的lib中查找第一类;其中,所述插件包括所述第一类加载器;步骤102、若所述第一类加载器在所述lib中查找到所述第一类,则使用所述lib中所述第一类的定义,对所述第一类进行加载。本实施例中,通过当第一类加载器需要加载第一类时,在插件的lib中查找第一类;若在所述lib中找到所述第一类,则使用所述lib中所述第一类的定义,对所述第一类进行加载;使得当插件的lib和宿主程序的lib中都包括第一类时,不会出现插件的类加载器收到该类加载器的父加载器返回的该类的对象,且插件的类加载器确定插件的lib中也包括了该类的定义的场景;因此,也不会出现类重复加载的错误;使得插件的lib和宿主程序的lib中可以包含相同的类,应用程序的开发更加方便;解决了现有技术中插件的lib和宿主程序的lib中不能包括相同的类,而导致应用程序开发不便的问题。图2为本发明类加载方法实施例二的流程图;如图2所示,本实施例的方法可以包括:步骤201、第一类加载器在插件的lib中查找第一类;其中,所述插件包括所述第一类加载器;可选的,所述第一类加载器为安卓(android)系统扩展类加载器dexclassloader。步骤202、若所述第一类加载器在所述lib中查找到所述第一类,则使用所述lib中所述第一类的定义,对所述第一类进行加载;步骤203、若所述第一类加载器在所述lib中未查找到所述第一类,则通知第二类加载器对所述第一类进行加载。其中,所述第二类加载器为所述第一类加载器的父加载器。可选的,所述第二类加载器为安卓android操作系统默认类加载器pathclassloader。可选的,所述第二类加载器对所述第一类进行加载,包括:所述第二类加载器在宿主程序的lib中查找所述第一类,并在找到所述第一类后,使用所述宿主程序的lib中所述第一类的定义,对所述第一类进行加载。可选的,步骤201之前或步骤201之后,还可以包括:所述第一类加载器将所述lib中定义的所有类,在所述第二类加载器中进行注册。由于当第三方jar包用反射机制加载类时,使用的是第二类加载器进行加载,而现有技术中第二类加载器并不能加载插件的lib中定义的类;本实施例中,通过将所述lib中定义的所有类,在所述第二类加载器中进行注册,使得第三方jar包可以通过第二类加载器加载所述插件的lib中定义的类。需要说明的是,所述将所述lib中定义的所有类,在所述第二加载器中进行注册的操作,可以由所述第一类加载器实现,或者也可以由所述插件中的其他代码实现。可选的,所述第一类加载器将所述lib中定义的所有类,在所述第二类加载器中进行注册,包括:所述第一类加载器将所述lib中定义的所有类的类名与所述插件的路径的对应关系,添加到所述第二类加载器的类列表。其中,所述类列表可以如下表1所示;表1类名路径aa11\22\33bb11\22\33…………其中,aa、bb为所述插件的lib中定义的类的类名,11\22\33为所述插件的路径。本实施例中,通过当第一类加载器需要加载第一类时,在插件的lib中查找第一类;若在所述lib中找到所述第一类,则使用所述lib中所述第一类的定义,对所述第一类进行加载;若所述第一类加载器在所述lib中未查找到所述第一类,则通知第二类加载器对所述第一类进行加载;使得当插件的lib和宿主程序的lib中都包括第一类时,不会出现插件的类加载器收到该类加载器的父加载器返回的该类的对象,且插件的类加载器确定插件的 lib中也包括了该类的定义的场景;因此,也不会出现类重复加载的错误;使得插件的lib和宿主程序的lib中可以包含相同的类,应用程序的开发更加方便,提高了开发效率。图3为本发明类加载方法实施例三的流程图;如图3所示,步骤301中,dexclassloader先从插件自身的liba中找某一类的定义;步骤302中当dexclassloader在插件的liba中未找到该类的定义时,则通知父加载器pathclassloader从宿主程序的libb中找该类的定义。本实施例中,通过重写dexclassloader加载类的模式,去掉双亲委派原则的使用,使插件可以优先使用插件的lib中定义的类;从而允许插件的lib和宿主的lib中包括相同的类。图4为本发明类加载器实施例一的结构示意图,本实施例中的类加载器为第一类加载器;如图4所示,本实施例的类加载器可以包括:查找模块401和加载模块402。其中,查找模块401,用于在插件的库lib中查找第一类;其中,所述插件包括所述类加载器;加载模块402,用于若所述查找模块在所述lib中查找到所述第一类,则使用所述lib中所述第一类的定义,对所述第一类进行加载。本实施例的类加载器,可以用于执行图1所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。图5为本发明类加载器实施例二的结构示意图,如图5所示,本实施例的类加载器在图4所示类加载器结构的基础上,进一步的,还可以包括:通知模块403,用于若所述查找模块在所述lib中未查找到所述第一类,则通知第二类加载器对所述第一类进行加载。可选的,本实施例的类加载器,还可以包括:注册模块404,用于将所述lib中定义的所有类,在所述第二类加载器中进行注册。可选的,注册模块404,具体用于将所述lib中定义的所有类的类名与所述插件的路径的对应关系,添加到所述第二类加载器的类列表。可选的,所述第一类加载器为dexclassloader,所述第二类加载器为pathclassloader。本实施例的类加载器,可以用于执行图2、图3所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1