CN110750315B - Android系统中的类加载方法、装置、设备和存储介质 - Google Patents
Android系统中的类加载方法、装置、设备和存储介质 Download PDFInfo
- Publication number
- CN110750315B CN110750315B CN201911332920.2A CN201911332920A CN110750315B CN 110750315 B CN110750315 B CN 110750315B CN 201911332920 A CN201911332920 A CN 201911332920A CN 110750315 B CN110750315 B CN 110750315B
- Authority
- CN
- China
- Prior art keywords
- loading
- class
- target
- identifier
- function
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例公开了一种Android系统中的类加载方法、装置、设备和存储介质。方法包括:在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载触发条件;确定加载类的目标加载模式标识,并依据加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;基于目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,生成目标加载类的目标类对象;基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中。通过上述技术方案,实现了Android系统中不同性质的类的加载,提高类加载的便捷性和管理效率。
Description
技术领域
本发明实施例涉及计算机技术,尤其涉及一种Android系统中的类加载方法、装置、设备和存储介质。
背景技术
对于基于Android系统的应用程序而言,其运行过程中涉及诸多相应功能的类Class,那么必然存在大量的类加载过程。
现有技术中的类通常是通过系统类加载进行加载的,例如通过new关键字进行类加载,或者通过反射的方式来进行加载。该加载过程不区分类对应的加载模式,例如全局具有唯一对象的单例对象加载模式、与活动窗口的生命周期同步的活动窗口同步加载模式、以及与直播间的生命周期同步的直播间同步加载模式等。
但是,上述类加载方式存在如下问题:(1)两种方式都只是将待加载的类加载到内存中,所生成的加载类的类对象均有系统管理,后续使用便捷性不高;(2)待加载的类所在的功能模块之间需要有较强的耦合性,否则会导致类加载失败,应用程序运行错误;(3)不同模式的类的加载及后续维护过程均需要程序人员手动编码维护,容易出现错误,降低代码可维护性和稳健性。
发明内容
本发明实施例提供一种Android系统中的类加载方法、装置、设备和存储介质,以实现Android系统中不同加载模式的类的自动加载与维护,提高类加载的便捷性和管理效率。
第一方面,本发明实施例提供了一种Android系统中的类加载方法,包括:
在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载类的加载触发条件;
当监测到所述加载触发条件时,确定加载类的目标加载模式标识,并依据所述目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;
基于所述目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化所述目标加载类,生成所述目标加载类的目标类对象;
基于所述目标类加载标识和所述目标加载模式标识,调用预设键值对集合的元素存储函数,将所述目标类对象存储至所述预设键值对集合中。
第二方面,本发明实施例还提供了一种Android系统中的类加载装置,该装置包括:
加载触发条件监测模块,用于在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载类的加载触发条件;
目标类加载标识确定模块,用于当监测到所述加载触发条件时,确定加载类的目标加载模式标识,并依据所述目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;
目标类对象生成模块,用于基于所述目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化所述目标加载类,生成所述目标加载类的目标类对象;
目标类对象存储模块,用于基于所述目标类加载标识和所述目标加载模式标识,调用预设键值对集合的元素存储函数,将所述目标类对象存储至所述预设键值对集合中。
第三方面,本发明实施例还提供了一种电子设备,该电子设备包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明任意实施例所提供的Android系统中的类加载方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现本发明任意实施例所提供的Android系统中的类加载方法。
本发明实施例通过预设元注解器的设置来为应用程序中不同加载模式的类进行相应类加载模式的注解设置,为后续不同模式的类的加载提供基础。通过当监测到加载触发条件时,确定加载类的目标加载模式标识,并依据目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;基于目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化目标加载类,生成目标加载类的目标类对象。实现了在监测到加载触发条件时自动触发类的加载操作,减少开发人员的手动编码触发操作,提高了代码可维护性和稳健性;且仅依据目标类加载标识来触发目标加载类的类加载操作,避免了传统加载方式中不同功能模块之间的代码高耦合问题,提高了类加载的便捷性。通过基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中。实现了目标类对象的集中管理,提高了类加载的管理效率,也提高了目标类对象后续使用的便捷性。
附图说明
图1是本发明实施例一中的一种Android系统中的类加载方法的流程图;
图2是本发明实施例二中的一种Android系统中的类加载方法的流程图;
图3是本发明实施例三中的一种Android系统中的类加载方法的流程图
图4是本发明实施例四中的一种Android系统中的类加载装置的结构示意图;
图5是本发明实施例五中的一种电子设备的结构示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
实施例一
本实施例提供的Android系统中的类加载方法可适用于基于Android系统开发的应用程序中不同加载模式的类的自动加载与管理。该方法可以由Android系统中的类加载装置来执行,该装置可以由软件和/或硬件的方式实现,该装置可以集成在搭载Android系统的电子设备中,例如手机、平板电脑或台式电脑等。参见图1,本实施例的方法包括:
S110、在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载类的加载触发条件。
其中,预设元注解器是预先设计的加载器的元注解器,其规范了注解器所支持的模式(例如文档模式)、生命周期参数(即注解器生命周期参数,用于声明注解器的有效性的作用域)、作用范围参数(即注解器范围参数,用于声明注解器的作用对象)以及属性类型(即注解属性类型)等内容。加载触发条件是指触发类加载的条件,例如可以是程序启动、第一次使用类或者与类相关的类对象的使用操作等。
为了实现加载器的自动触发和类自动加载,本发明实施例中对所有需要被加载的类(简称加载类)均设置了预设元注解器对应的注解,这些注解会被注解编译器解析,以获得元注解器中的各项参数值,例如注解器生命周期参数。当应用程序被触发后,判断应用程序的运行状态,并在运行状态与注解器生命周期参数一致时,启动被注解了上述注解的加载类的加载触发条件的自动监控。例如注解器生命周期参数为“编译时”,则当应用程序的代码处于编译阶段时,便触发加载触发条件的监测。如果注解器生命周期参数为“运行时”,那么当应用程序编译完成且处于运行时状态时,再开始进行加载触发条件的监控。
示例性地,预设元注解器的注解器生命周期参数、注解器范围参数和注解属性类型分别为运行时参数、Class类以及预设枚举类型,其中,预设枚举类型的元素包含单例对象加载模式标识、活动窗口同步加载模式标识和直播间同步加载模式标识。
预设元注解器的功能主要是提供后续类加载器的注解描述信息,以便提高类加载器使用的便捷性,同时提供统一的加载模式设计等。预设元注解器的设计规范可以示例如下:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType. CLASS)
public @interface DYLoader{
LoaderModeEnum value();
}
// LoaderModeEnum类的定义方法
Enum LoaderModeEnum{
LOAD_TYPE_SINGLE;
LOAD_TYPE_ACTIVITY;
LOAD_TYPE_ROOM;
}。
其中,@Documented表示该加载器规范是能够支持文档模式的。@Retention(RetentionPolicy.RUNTIME)即为注解器生命周期参数,其为运行时RUNTIME参数,表示该类加载器是用于运行时的设计,之所以设计成运行时是能够保证在运行的时候动态的实现类的加载功能,这样能够使得加载类在使用的时候被加载,而不是一次性全部加载,从而比较好的提高程序的性能。@Target(ElementType.CLASS)即为注解器范围参数,其为Class类,表示该类加载器的规范是用于类上面,且只有注解了该元注解后的加载类后续才能够对类进行加载实现,而其他类型上无法使用该协议,这样就对该协议的范围能够有一个限定,避免调用方出现乱调用的情况,能够有效的保证协议的范围性。public @interfaceDYLoader表示元注解器的注解名称为DYLoader,后续通过DYLoader来实现对加载类的不同模式的加载。LoaderModeEnum即为注解属性类型,该参数是一个枚举类型的参数(即预设枚举类型),之所以本方案选择设计成枚举的好处是能够圈定加载模式的类型,这样调用方只能选择LoaderModeEnum中支持的加载模式,不支持的加载模式不被处理,有效的避免了乱使用加载模式的可能性,从而能够有效的提高程序的稳定系和规范性。EnumLoaderModeEnum用于表示LoaderModeEnum是一个枚举类型的类,该枚举类中包含多个枚举元素信息,每一个枚举信息表示的是一种加载模式的标识(即加载模式标识),具体的描述信息如下:
a) LOAD_TYPE_SINGLE: 单例对象加载模式标识,表示唯一的对象,也就是说类加载器能够加载并且确保内存中有且仅有一个该对象。
b) LOAD_TYPE_ACTIVITY:活动窗口同步加载模式标识,表示Android中Activity级别的对象,用于表示该对象的生命周期和Activity进行了绑定。在Activity创建的时候进行加载,Activity销毁的时候进行释放。
c) LOAD_TYPE_ROOM:直播间同步加载模式标识,表示和直播间房间相关的对象,表示在直播间房间打开的时候进行创建,直播间房间关闭的时候进行销毁。
S120、当监测到加载触发条件时,确定加载类的目标加载模式标识,并依据目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识。
其中,类加载标识是指加载类的类标识,其可以是类的全局唯一性标识name,也可以是与全局唯一性标识name对应的调用标识id等。为了提高程序运行的效率,提高类加载过程中所需参数的获取便捷性,本实施例中可以预先设置加载类、类加载标识和加载模式标识之间的映射关系,该映射关系中一种加载模式标识可以对应有至少一个加载类及其对应的类加载标识。为了进一步提高数据获取便捷性及映射关系中数据修改的便捷性,可以将该映射关系存储于配置文件中,以便在应用程序启动时便读取该配置文件。
不同加载模式的加载类的加载触发条件会不同,故可以根据监测到的加载触发条件来确定当前操作对应的加载模式(即目标加载模式),进而确定该目标加载模式对应的目标加载模式标识。应当说明的是,同一个加载模式的加载类,会一次性全部被加载。故监测到某一个加载模式对应的加载触发条件时,意味着以该加载模式加载的类需要全部被加载。例如,当确定目标加载模式标识为LOAD_TYPE_ACTIVITY时,便会加载所有与activity的生命周期同步的加载类。
确定了目标加载模式标识之后,便以其为查找索引,从映射关系中查找对应的至少一个类加载标识,作为各目标类加载标识。需要说明的是,如果目标类加载标识为调用标识id,那么还需要根据该调用标识id来确定其对应的目标加载类的全局唯一性标识name。
S130、基于目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化目标加载类,生成目标加载类的目标类对象。
确定了至少一个目标类加载标识后,便以其中一个目标类加载标识为函数输入参数,顺次调用系统Class类中的类对象加载函数forname和类对象实例化函数newInstance,即Class.forName(name).newInstance(),便可完成该目标类加载标识对应的目标加载类的加载及实例化操作,生成目标加载类的实例化对象,即目标类对象。针对每一个目标类加载标识,均重复上述过程,便可生成每个目标加载类对应的目标类对象。
S140、基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中。
其中,预设键值对集合是预先设计的键值对类型的集合对象,其用于存储各个目标类对象,以实现目标类对象的统一管理。例如预设键值对集合可以为Map<Type, Map<String, Object>>loaderMap,其中,该数据结构中第一个泛型参数是Type,用于表示目标加载模式标识,与之对应的数据结构是Map<String,Object>类型的数据结构,其中String用于表示目标类加载标识,Object表示目标类对象。
当获得目标类对象instance之后,便需要将其存储至预设键值对集合中。具体实施时,先以目标类加载标识name为输入参数,调用预设键值对集合loaderMap中的子键值对集合Map<String, Object>OMap的元素存储函数set,即OMap.set(name)= instance,将目标类对象存储至子键值对集合OMap中。之后,再以目标加载模式标识为输入参数,调用预设键值对集合loaderMap的元素存储函数set,即loaderMap.set(LOAD_TYPE_ACTIVITY)=OMap,便实现了将目标类对象存储至预设键值对集合中,后续便可通过该预设键值对集合来进行目标类对象的获取及调用等操作。
本实施例的技术方案,通过预设元注解器的设置来为应用程序中不同加载模式的类进行相应类加载模式的注解设置,为后续不同模式的类的加载提供基础。通过当监测到加载触发条件时,确定加载类的目标加载模式标识,并依据目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;基于目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化目标加载类,生成目标加载类的目标类对象。实现了在监测到加载触发条件时自动触发类的加载操作,减少开发人员的手动编码触发操作,提高了代码可维护性和稳健性;且仅依据目标类加载标识来触发目标加载类的类加载操作,避免了传统加载方式中不同功能模块之间的代码高耦合问题,提高了类加载的便捷性。通过基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中。实现了目标类对象的集中管理,提高了类加载的管理效率,也提高了目标类对象后续使用的便捷性。
实施例二
本实施例在上述实施例一的基础上,对“当监测到加载触发条件时,确定加载类的目标加载模式标识”进行了进一步优化。在此基础上,还可以进一步对单例对象加载模式的类加载过程进行说明。其中与上述各实施例相同或相应的术语的解释在此不再赘述。参见图2,本实施例提供的Android系统中的类加载方法包括:
S210、在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,以预设元注解器中的注解属性类型为输入参数,调用程序元素获取函数,生成待加载类对象集合。
其中,程序元素获取函数getElementsAnnotatedWith()是一个用于获取程序中包含的元素的系统函数,这里的程序元素element可以是包、类/接口、属性变量、方法/方法形参、泛型参数等。待加载类对象集合listTarget是存储了各个加载类的集合对象,其中存储有每个加载类及其对应的全局唯一性标识name和调用标识id。
当程序运行状态为“运行时”时,通过扫描程序中的注解来获得应用程序中包含的加载类。具体实施时,首先,以预设元注解器中的注解属性类型LoaderModeEnum.class为输入参数,调用程序元素获取函数,即getElementsAnnotatedWith(LoaderModeEnum.class),查找程序中所有注解了枚举类类型的加载类,函数返回一个List<Element>类型的程序元素集合对象listElement。之后,对程序元素集合对象listElement中的每个元素进行校验。具体为:通过列表元素遍历方法for(Element el: listElement)来依次取出Element类型的元素对象el;然后针对每个元素对象,通过元素类型获取函数来获取元素对象的类型,并判断该类型是否是类类型,即el.getKind() == ElementKind.CLASS;如果是,则将该元素对象el存储至待加载类对象集合listTarget中。
S220、当监测到系统应用程序类的生命周期启动函数的调用指令,或者目标加载类的调用指令时,确定目标加载模式标识为单例对象加载模式标识。
单例对象加载模式的加载类的加载触发条件为应用程序启动时或者第一次使用该加载类时,其对应的系统指令分别为系统应用程序类application的生命周期启动函数oncreat的调用指令,或者加载类被调用时的调用指令。具体采用哪种加载触发条件可以自行设置。当监测到上述任一调用指令时,便开始单例对象加载模式的加载类的加载操作。首先,便是确定目标加载模式标识为单例对象加载模式标识LOAD_TYPE_SINGLE。
S230、依据目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识。
根据单例对象加载模式标识LOAD_TYPE_SINGLE,从映射关系中确定出目标加载类的目标类加载标识,此处的目标类加载标识为调用标识id。
S240、以单例对象加载模式标识为输入参数,调用预设键值对集合的值信息获取函数,获得与单例对象加载模式对应的单例键值对对象。
由于单例对象加载模式需要确保全局有且仅有一个加载类的实例化对象,故在执行类加载操作之前,需要先判断内存中是否存在已经被加载过的类对象。首先,以单例对象加载模式标识LOAD_TYPE_SINGLE为函数输入参数,调用预设键值对集合loaderMap的值信息获取函数get(),即loaderMap.get(LOAD_TYPE_SINGLE),函数返回一个Map<String,Object>类型的对象singleMap,即为单例对象加载模式对应的单例键值对对象。
S250、以目标类加载标识为输入参数,调用待加载类对象集合的元素获取函数,获得与目标类加载标识对应的目标类标识。
由于S230中所获得的目标类加载标识为调用标识id,而后续所需为目标加载类的全局唯一性标识name,即目标类标识,故此处需要进一步根据目标类加载标识来获取目标加载类的目标类标识name。具体为:以目标类加载标识id为输入参数,调用待加载类对象集合listTarget的元素获取函数get(),即listTarget.get(id),获得与目标类加载标识对应的目标类标识。
需要说明的是,S240和S250的执行顺序不限定。
S260、以目标类标识为输入参数,调用单例键值对对象的值信息获取函数,获得单例目标类对象,并判断单例目标类对象是否为空对象。
通过S240获得了包含单例对象加载模式对应的目标类对象(即单例目标类对象)的单例键值对对象singleMap。此时,需要进一步从单例键值对对象singleMap中获取单例目标类对象。具体为:以目标类标识name为函数输入参数,调用单例键值对对象singleMap的值信息获取函数get(),即singleMap.get(name),函数返回一个Object类型的对象,即单例目标类对象。之后,通过singleMap.get(name)==null的方式判断单例目标类对象是否为空对象。
S270、若否,则将单例目标类对象作为目标加载类的目标类对象。
如果不是空对象,说明该目标加载类已经被加载过,内存中已经存在单例目标类对象,直接将其作为目标加载类的目标类对象进行返回即可,即return singleMap.get(name)。
S280、若是,则基于目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化目标加载类,生成目标加载类的目标类对象。
如果是空对象,说明该目标加载类还未被加载,此时按照S130的说明进行类加载操作。
S290、基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中。
通过调用singleMap.set(name)= instance方法来将目标类对象instance封装到单例键值对对象singleMap中,从而进一步将其存储至预设键值对集合中。
本实施例的技术方案,通过当监测到系统应用程序类的生命周期启动函数的调用指令,或者目标加载类的调用指令时,确定目标加载模式标识为单例对象加载模式标识。实现了更加便捷地自动确定单例对象加载模式标识。通过以目标类加载标识为输入参数,调用待加载类对象集合的元素获取函数,获得与目标类加载标识对应的目标类标识。实现了对目标类标识name的进一步封装,提高了目标类标识信息的安全性。通过以单例对象加载模式标识为输入参数,调用预设键值对集合的值信息获取函数,获得与单例对象加载模式对应的单例键值对对象;以目标类标识为输入参数,调用单例键值对对象的值信息获取函数,获得单例目标类对象,并判断单例目标类对象是否为空对象;若否,则将单例目标类对象作为目标加载类的目标类对象。实现了以目标类对象存储和判空的处理,保证单例对象加载模式对应的目标加载类的加载对象的全局唯一性。
实施例三
本实施例在上述实施例一的基础上,对“当监测到加载触发条件时,确定加载类的目标加载模式标识”进行了进一步优化。在此基础上,还可以进一步增加活动窗口同步加载模式和直播间同步加载模式对应的已加载的类的释放步骤。其中与上述各实施例相同或相应的术语的解释在此不再赘述。参见图3,本实施例提供的Android系统中的类加载方法包括:
S310、在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载类的加载触发条件。
S320、当监听到活动窗口对象的生命周期启动函数的调用指令时,确定目标加载模式标识为活动窗口同步加载模式标识。
活动窗口同步加载模式的加载类都是与活动窗口activity相关联的,即activity创建时,该模式下的所有加载类被加载,当activity销毁时,该模式下所有被加载的类需要同步销毁。故活动窗口同步加载模式的类加载的加载触发条件便是活动窗口对象的生命周期启动函数OnCreate被回调。具体监听方式为:通过调用系统的系统应用程序类Application对象的registerActivityLifeCycle监听器来实现对系统Activity的生命周期进行监听。当监听到活动窗口对象的生命周期启动函数的调用指令时,便可确定目标加载模式标识为活动窗口同步加载模式标识LOAD_TYPE_ACTIVITY,开始该加载模式下所有加载类的加载流程。
S330、当监听到直播间对象的生命周期启动函数的调用指令时,确定目标加载模式标识为直播间同步加载模式标识。
直播间同步加载模式的加载类均与直播间room相关联,其随着直播间room对象的创建而全部被加载,也随着直播间room对象的销毁而全部被注销。
该加载模式的加载触发条件为直播间对象的生命周期启动函数OnCreate被回调。故同S320的说明,当监听到直播间对象的生命周期启动函数的调用指令时,可确定目标加载模式标识为直播间同步加载模式标识LOAD_TYPE_ROOM,开始该加载模式下所有加载类的加载流程。
S340、依据目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识。
S350、基于目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化目标加载类,生成目标加载类的目标类对象。
S360、基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中。
S370、当监听到活动窗口对象的生命周期结束函数的调用指令时,以活动窗口同步加载模式标识为输入参数,调用预设键值对集合的元素获取函数,获得与活动窗口对象同步的目标类对象集合,并基于活动窗口同步加载模式标识和映射关系,通过与活动窗口对象同步的目标类对象集合的元素删除函数,销毁与活动窗口对象同步的各目标类对象。
根据上述说明,当监听到活动窗口对象的生命周期结束函数onDestory的调用指令时,说明需要销毁活动窗口对象,此时也要同步地销毁活动窗口同步加载模式对应的所有已被加载的目标类对象,而这些目标类对象全部存储于预设键值对集合loaderMap中。
具体实施时,所有目标类对象的销毁过程为:以活动窗口同步加载模式标识LOAD_TYPE_ACTIVITY为函数输入参数,调用预设键值对集合loaderMap的元素获取函数get(),即loaderMap.get(LOAD_TYPE_ACTIVITY),函数返回值为目标类对象集合listMap,该目标类对象集合中存储了所有活动窗口同步加载模式下被加载的加载类的类对象。之后,以活动窗口同步加载模式标识为查找索引,从映射关系中获取所有该加载模式对应的目标类加载标识name。最后,以目标类加载标识name为函数输入参数,调用目标类对象集合listMap的元素删除函数remove(),即listMap.remove(name),将所有该加载模式下对应的目标类对象同步销毁。
S380、当监听到直播间对象的生命周期结束函数的调用指令时,以直播间同步加载模式标识为输入参数,调用预设键值对集合的元素获取函数,获得与直播间对象同步的目标类对象集合,并基于直播间同步加载模式标识和映射关系,通过与直播间对象同步的目标类对象集合的元素删除函数,销毁与直播间对象同步的各目标类对象。
该步骤的操作说明可参见S370,只是其中的监听对象为直播间对象room,加载模式标识为直播间同步加载模式标识LOAD_TYPE_ROOM。
本实施例的技术方案,通过将活动窗口同步加载模式和直播间同步加载模式的加载触发条件分别设置为活动窗口对象的生命周期启动函数的调用指令和直播间对象的生命周期启动函数的调用指令,实现了这两种类加载模式的类加载操作的自动触发,进一步提高类加载的便捷性。通过基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中,以及当监听到活动窗口对象的生命周期结束函数的调用指令时,以活动窗口同步加载模式标识为输入参数,调用预设键值对集合的元素获取函数,获得与活动窗口对象同步的目标类对象集合,并基于活动窗口同步加载模式标识和映射关系,通过与活动窗口对象同步的目标类对象集合的元素删除函数,销毁与活动窗口对象同步的各目标类对象;和/或当监听到直播间对象的生命周期结束函数的调用指令时,以直播间同步加载模式标识为输入参数,调用预设键值对集合的元素获取函数,获得与直播间对象同步的目标类对象集合,并基于直播间同步加载模式标识和映射关系,通过与直播间对象同步的目标类对象集合的元素删除函数,销毁与直播间对象同步的各目标类对象。实现了活动窗口同步加载模式和直播间同步加载模式对应的目标类对象的自动生成、管理和自动销毁,进一步提高了该两种加载模式下目标类对象的管理效率。
实施例四
本实施例提供一种Android系统中的类加载装置,参见图4,该装置具体包括:
加载触发条件监测模块410,用于在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载类的加载触发条件;
目标类加载标识确定模块420,用于当监测到加载触发条件时,确定加载类的目标加载模式标识,并依据目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;
目标类对象生成模块430,用于基于目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化目标加载类,生成目标加载类的目标类对象;
对象存储模块440,用于基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中。
可选地,预设元注解器的注解器生命周期参数、注解器范围参数和注解属性类型分别为运行时参数、Class类以及预设枚举类型,其中,预设枚举类型的元素包含单例对象加载模式标识、活动窗口同步加载模式标识和直播间同步加载模式标识。
可选地,目标类加载标识确定模块420具体用于:
当监测到系统应用程序类的生命周期启动函数的调用指令,或者目标加载类的调用指令时,确定目标加载模式标识为单例对象加载模式标识。
进一步地,在上述装置的基础上,该装置还包括待加载类对象集合生成模块,用于:
在监测加载类的加载触发条件之前,以预设元注解器中的注解属性类型为输入参数,调用程序元素获取函数,生成待加载类对象集合;
相应地,在上述装置的基础上,该装置还包括加载对象判空模块,用于:
在依据目标加载模式,以及待加载类、类加载标识和加载模式之间的映射关系,确定目标加载类的目标类加载标识之后,以单例对象加载模式标识为输入参数,调用预设键值对集合的值信息获取函数,获得与单例对象加载模式对应的单例键值对对象;
以目标类加载标识为输入参数,调用待加载类对象集合的元素获取函数,获得与目标类加载标识对应的目标类标识;
以目标类标识为输入参数,调用单例键值对对象的值信息获取函数,获得单例目标类对象,并判断单例目标类对象是否为空对象;
若否,则将单例目标类对象作为目标加载类的目标类对象。
可替代地,目标类加载标识确定模块420具体用于:
当监听到活动窗口对象的生命周期启动函数的调用指令时,确定目标加载模式标识为活动窗口同步加载模式标识。
可替代地,目标类加载标识确定模块420具体用于:
当监听到直播间对象的生命周期启动函数的调用指令时,确定目标加载模式标识为直播间同步加载模式标识。
可选地,在上述装置的基础上,该装置还包括目标类对象释放模块,用于:
在基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中之后,当监听到活动窗口对象的生命周期结束函数的调用指令时,以活动窗口同步加载模式标识为输入参数,调用预设键值对集合的元素获取函数,获得与活动窗口对象同步的目标类对象集合,并基于活动窗口同步加载模式标识和映射关系,通过与活动窗口对象同步的目标类对象集合的元素删除函数,销毁与活动窗口对象同步的各目标类对象;和/或
当监听到直播间对象的生命周期结束函数的调用指令时,以直播间同步加载模式标识为输入参数,调用预设键值对集合的元素获取函数,获得与直播间对象同步的目标类对象集合,并基于直播间同步加载模式标识和映射关系,通过与直播间对象同步的目标类对象集合的元素删除函数,销毁与直播间对象同步的各目标类对象。
通过本发明实施例四的一种Android系统中的类加载装置,实现了在监测到加载触发条件时自动触发类的加载操作,减少开发人员的手动编码触发操作,提高了代码可维护性和稳健性;且仅依据目标类加载标识来触发目标加载类的类加载操作,避免了传统加载方式中不同功能模块之间的代码高耦合问题,提高了类加载的便捷性。以及实现了目标类对象的集中管理,提高了类加载的管理效率,也提高了目标类对象后续使用的便捷性。
本发明实施例所提供的Android系统中的类加载装置可执行本发明任意实施例所提供的Android系统中的类加载方法,具备执行方法相应的功能模块和有益效果。
值得注意的是,上述Android系统中的类加载装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
实施例五
参见图5,本实施例提供了一种电子设备,其包括:一个或多个处理器520;存储装置510,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器520执行,使得一个或多个处理器520实现本发明实施例所提供的Android系统中的类加载方法,包括:
在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载类的加载触发条件;
当监测到加载触发条件时,确定加载类的目标加载模式标识,并依据目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;
基于目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化目标加载类,生成目标加载类的目标类对象;
基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中。
当然,本领域技术人员可以理解,处理器520还可以实现本发明任意实施例所提供的Android系统中的类加载方法的技术方案。
图5显示的电子设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。如图5所示,该电子设备包括处理器520、存储装置510、输入装置530和输出装置540;电子设备中处理器520的数量可以是一个或多个,图5中以一个处理器520为例;电子设备中的处理器520、存储装置510、输入装置530和输出装置540可以通过总线或其他方式连接,图5中以通过总线550连接为例。
存储装置510作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的Android系统中的类加载方法对应的程序指令/模块(例如,Android系统中的类加载装置中的加载触发条件监测模块、目标类加载标识确定模块、目标类对象生成模块和目标类对象存储模块)。
存储装置510可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储装置510可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储装置510可进一步包括相对于处理器520远程设置的存储器,这些远程存储器可以通过网络连接至电子设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置530可用于接收输入的数字或字符信息,以及产生与电子设备的用户设置以及功能控制有关的键信号输入。输出装置540可包括显示屏等显示设备。
实施例六
本实施例提供一种包含计算机可执行指令的存储介质,计算机可执行指令在由计算机处理器执行时用于执行一种Android系统中的类加载方法,该方法包括:
在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载类的加载触发条件;
当监测到加载触发条件时,确定加载类的目标加载模式标识,并依据目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;
基于目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化目标加载类,生成目标加载类的目标类对象;
基于目标类加载标识和目标加载模式标识,调用预设键值对集合的元素存储函数,将目标类对象存储至预设键值对集合中。
当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上的方法操作,还可以执行本发明任意实施例所提供的Android系统中的类加载方法中的相关操作。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory, ROM)、随机存取存储器(RandomAccess Memory, RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台电子设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所提供的Android系统中的类加载方法。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (10)
1.一种Android系统中的类加载方法,其特征在于,包括:
在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载类的加载触发条件;
当监测到所述加载触发条件时,确定加载类的目标加载模式标识,并依据所述目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;
基于所述目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化所述目标加载类,生成所述目标加载类的目标类对象;
基于所述目标类加载标识和所述目标加载模式标识,调用预设键值对集合的元素存储函数,将所述目标类对象存储至所述预设键值对集合中。
2.根据权利要求1所述的方法,其特征在于,预设元注解器的注解器生命周期参数、注解器范围参数和注解属性类型分别为运行时参数、Class类以及预设枚举类型,其中,所述预设枚举类型的元素包含单例对象加载模式标识、活动窗口同步加载模式标识和直播间同步加载模式标识。
3.根据权利要求2所述的方法,其特征在于,当监测到所述加载触发条件时,确定加载类的目标加载模式标识包括:
当监测到系统应用程序类的生命周期启动函数的调用指令,或者所述目标加载类的调用指令时,确定所述目标加载模式标识为所述单例对象加载模式标识。
4.根据权利要求3所述的方法,其特征在于,在监测加载类的加载触发条件之前,还包括:
以所述预设元注解器中的注解属性类型为输入参数,调用程序元素获取函数,生成待加载类对象集合;
在依据所述目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识之后,还包括:
以所述单例对象加载模式标识为输入参数,调用所述预设键值对集合的值信息获取函数,获得与所述单例对象加载模式对应的单例键值对对象;
以所述目标类加载标识为输入参数,调用所述待加载类对象集合的元素获取函数,获得与所述目标类加载标识对应的目标类标识;
以所述目标类标识为输入参数,调用所述单例键值对对象的值信息获取函数,获得单例目标类对象,并判断所述单例目标类对象是否为空对象;
若否,则将所述单例目标类对象作为所述目标加载类的目标类对象。
5.根据权利要求2所述的方法,其特征在于,当监测到所述加载触发条件时,确定加载类的目标加载模式标识包括:
当监听到活动窗口对象的生命周期启动函数的调用指令时,确定所述目标加载模式标识为所述活动窗口同步加载模式标识。
6.根据权利要求2所述的方法,其特征在于,当监测到所述加载触发条件时,确定加载类的目标加载模式标识包括:
当监听到直播间对象的生命周期启动函数的调用指令时,确定所述目标加载模式标识为所述直播间同步加载模式标识。
7.根据权利要求2所述的方法,其特征在于,在基于所述目标类加载标识和所述目标加载模式标识,调用预设键值对集合的元素存储函数,将所述目标类对象存储至所述预设键值对集合中之后,还包括:
当监听到活动窗口对象的生命周期结束函数的调用指令时,以所述活动窗口同步加载模式标识为输入参数,调用所述预设键值对集合的元素获取函数,获得与所述活动窗口对象同步的目标类对象集合,并基于所述活动窗口同步加载模式标识和所述映射关系,通过与所述活动窗口对象同步的目标类对象集合的元素删除函数,销毁与所述活动窗口对象同步的各目标类对象;
和/或当监听到直播间对象的生命周期结束函数的调用指令时,以所述直播间同步加载模式标识为输入参数,调用所述预设键值对集合的元素获取函数,获得与所述直播间对象同步的目标类对象集合,并基于所述直播间同步加载模式标识和所述映射关系,通过与所述直播间对象同步的目标类对象集合的元素删除函数,销毁与所述直播间对象同步的各目标类对象。
8.一种Android系统中的类加载装置,其特征在于,包括:
加载触发条件监测模块,用于在应用程序的运行状态与预设元注解器中的注解器生命周期参数一致时,监测加载类的加载触发条件;
目标类加载标识确定模块,用于当监测到所述加载触发条件时,确定加载类的目标加载模式标识,并依据所述目标加载模式标识,以及加载类、类加载标识和加载模式标识之间的映射关系,确定目标加载类的目标类加载标识;
目标类对象生成模块,用于基于所述目标类加载标识,调用系统Class类中的类对象加载函数和类对象实例化函数,加载并实例化所述目标加载类,生成所述目标加载类的目标类对象;
目标类对象存储模块,用于基于所述目标类加载标识和所述目标加载模式标识,调用预设键值对集合的元素存储函数,将所述目标类对象存储至所述预设键值对集合中。
9.一种电子设备,其特征在于,所述电子设备包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-7中任一所述的Android系统中的类加载方法。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-7中任一所述的Android系统中的类加载方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911332920.2A CN110750315B (zh) | 2019-12-23 | 2019-12-23 | Android系统中的类加载方法、装置、设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911332920.2A CN110750315B (zh) | 2019-12-23 | 2019-12-23 | Android系统中的类加载方法、装置、设备和存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110750315A CN110750315A (zh) | 2020-02-04 |
CN110750315B true CN110750315B (zh) | 2020-06-02 |
Family
ID=69285952
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911332920.2A Active CN110750315B (zh) | 2019-12-23 | 2019-12-23 | Android系统中的类加载方法、装置、设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110750315B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111338705B (zh) * | 2020-02-13 | 2021-03-26 | 北京房江湖科技有限公司 | 一种数据处理的方法、装置和存储介质 |
CN114510334A (zh) * | 2022-02-16 | 2022-05-17 | 阿波罗智能技术(北京)有限公司 | 类实例的调用方法、装置、电子设备及自动驾驶车辆 |
CN116860658B (zh) * | 2023-06-21 | 2024-05-28 | 中国科学院软件研究所 | 一种面向大数据处理框架的高效半自动垃圾回收方法和系统 |
CN116974653B (zh) * | 2023-09-21 | 2024-01-09 | 阿里云计算有限公司 | 类加载方法及系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109828784A (zh) * | 2019-02-03 | 2019-05-31 | 普信恒业科技发展(北京)有限公司 | 一种任务抓取方法及装置 |
CN109857637A (zh) * | 2018-12-25 | 2019-06-07 | 杭州茂财网络技术有限公司 | 一种基于注解的Java语言方法覆盖率和方法输入输出统计方法及装置 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TW576984B (en) * | 2002-07-19 | 2004-02-21 | Jen-Hwang Weng | On-line web page editing system and method |
US10360008B2 (en) * | 2016-09-16 | 2019-07-23 | Oracle International Corporation | Metadata application constraints within a module system based on modular encapsulation |
US10613834B2 (en) * | 2016-09-17 | 2020-04-07 | Oracle International Corporation | Systems and method for supporting reactive responses using a dependency injection framework |
CN109947488B (zh) * | 2019-03-19 | 2022-05-10 | 武汉斗鱼鱼乐网络科技有限公司 | 通用功能模块的对象初始化方法、装置、设备和存储介质 |
CN110045997B (zh) * | 2019-04-15 | 2022-07-05 | 武汉斗鱼鱼乐网络科技有限公司 | 基础功能模块的对象初始化方法、装置、设备和存储介质 |
CN110489180B (zh) * | 2019-08-07 | 2023-03-28 | 北京字节跳动网络技术有限公司 | 一种埋点上报方法、装置、介质和电子设备 |
-
2019
- 2019-12-23 CN CN201911332920.2A patent/CN110750315B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109857637A (zh) * | 2018-12-25 | 2019-06-07 | 杭州茂财网络技术有限公司 | 一种基于注解的Java语言方法覆盖率和方法输入输出统计方法及装置 |
CN109828784A (zh) * | 2019-02-03 | 2019-05-31 | 普信恒业科技发展(北京)有限公司 | 一种任务抓取方法及装置 |
Non-Patent Citations (2)
Title |
---|
"Bringing a richer annotation model to Java";Walter Cazzola;《Computer Languages, Systems & Structures》;20140306;2-18 * |
"Identification and Extraction of Design Pattern Information in Java Program";Chengwan He;《2008 Ninth ACIS International Conference on Software Engineering, Artificial Intelligence, Networking, and Parallel/Distributed Computing》;20080808;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110750315A (zh) | 2020-02-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110750315B (zh) | Android系统中的类加载方法、装置、设备和存储介质 | |
CN111124906B (zh) | 基于动态埋点的跟踪方法、编译方法、装置和电子设备 | |
US9600411B2 (en) | System and method for determining an object's lifetime in an object oriented environment | |
WO2018126964A1 (zh) | 任务执行方法、装置和服务器 | |
CN108536492B (zh) | 一种直播间属性信息获取方法、装置、设备及存储介质 | |
CN107526623B (zh) | 一种数据处理方法及装置 | |
CN111865978B (zh) | 一种微服务的请求标识更新方法、装置、设备及介质 | |
CN109343983B (zh) | 功能模块间的信息交互方法、装置、设备及存储介质 | |
CN112214388A (zh) | 内存监控方法、装置、设备及计算机可读存储介质 | |
CN110457132B (zh) | 一种功能对象的创建方法、装置和终端设备 | |
CN114281653A (zh) | 应用程序的监控方法、装置及计算设备 | |
CN110045997B (zh) | 基础功能模块的对象初始化方法、装置、设备和存储介质 | |
CN109254858B (zh) | 活动窗口的数据共享方法、装置、设备及存储介质 | |
CN114860204B (zh) | 程序处理、运行方法、装置、终端、智能卡及存储介质 | |
CN111352631A (zh) | 一种接口兼容性检测方法及装置 | |
CN112988277B (zh) | 规则文件加载方法、装置、服务器及介质 | |
CN116382929A (zh) | 分布式锁处理方法、装置、电子设备和存储介质 | |
CN115729590A (zh) | 服务部署方法、装置、设备和计算机可读存储介质 | |
CN111124386B (zh) | 基于Unity的动画事件处理方法、装置、设备和存储介质 | |
CN109005448B (zh) | 弹幕消息分发方法、装置、设备及存储介质 | |
CN109460251B (zh) | 构件集成框架管理方法和装置 | |
CN104808985B (zh) | 应用程序中对象的管理方法及装置 | |
US11017032B1 (en) | Document recovery utilizing serialized data | |
WO2022104883A1 (zh) | 一种多类型场景共存的添加方法、装置、终端及存储介质 | |
CN113268267B (zh) | 一种数据包生成方法、装置、计算机设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
EE01 | Entry into force of recordation of patent licensing contract |
Application publication date: 20200204 Assignee: Hubei Special Automobile Network Technology Co.,Ltd. Assignor: WUHAN DOUYU YULE NETWORK TECHNOLOGY Co.,Ltd. Contract record no.: X2023980034619 Denomination of invention: Class loading methods, devices, devices, and storage media in Android systems Granted publication date: 20200602 License type: Common License Record date: 20230414 |
|
EE01 | Entry into force of recordation of patent licensing contract |