掌桥专利:专业的专利平台
掌桥专利
首页

一种基于ASM字节码插桩的非入侵准实时监控方法及系统

文献发布时间:2024-04-18 19:58:21


一种基于ASM字节码插桩的非入侵准实时监控方法及系统

技术领域

本发明涉及信息监控技术领域,并且更具体地,涉及一种基于ASM字节码插桩的非入侵准实时监控方法及系统。

背景技术

目前主流的软件系统架构体系中,都会包含一个重要的组成部分:监控服务。可针对各个系统服务的运行情况进行实时采集、计算分析和可视化展示,内容包括QPS(每秒查询率)、TPS(每秒事务率)、健康度、可用率、响应时长、调用量、负载、CPU(中央处理器)等监控信息。一套完善的监控服务不仅可以保障软件系统的正常运转,还可以为运维人员、运营人员的工作提供有力支撑。

早期的监控服务通常需要在软件系统中以硬编码的方式对业务代码注入具体监控代码,以实现相应的监控功能。这种方式会导致监控代码大量侵入业务系统,既破坏了原有架构设计的代码结构,又严重影响系统的稳定性。同时由于监控代码通常比较零散琐碎,如需对现有监控功能进行扩展或是将其迁移到其他系统,代价则会相当大,就算完成功能扩展或者监控能力的迁移,后续也依然不易维护。

发明内容

为了解决上述背景技术所述的至少一个问题,本发明提供一种基于ASM字节码插桩的非入侵准实时监控方法及系统。

根据本发明的一个方面,提供了一种基于ASM字节码插桩的非入侵准实时监控方法,包括:

通过JavaAgent技术和ASM框架,以非入侵方式采集被监控的Java方法执行过程中的关键信息,并将采集到的关键信息传输至基于RocketMQ实现的消息队列;

通过基于RocketMQ实现的消息队列将关键信息发送至监控服务平台后端程序;

通过监控服务平台后端程序对消息队列的关键信息进行消费和持久化处理,存入RDBMS关系型数据库;

利用ElasticSearch引擎从RDBMS关系型数据库获取关键信息进行准实时搜索和分析;

将分析得到的结果通过ECharts可视化工具展示到监控服务平台的前端页面。

可选地,所述通过JavaAgent技术和ASM框架,以非入侵方式采集被监控的Java方法执行过程中的关键信息,包括:

通过JavaAgentMain类实现JavaAgent程序的入口功能;

通过ByteCodeTransformer类,利用ASM框架实现字节码的操作逻辑;

通过ByteCodeMethodVisitor类以字节码方式解析Java方法的信息;

进入被监控的Java方法并对字节码进行增强;

当被监控的Java方法逻辑执行完毕时,结束Java方法并对字节码进行增强,得到Java方法执行时监控到的关键信息。

可选地,所述通过JavaAgentMain类实现JavaAgent程序的入口功能,包括:

在Java程序运行时,Java虚拟机在JavaAgentMain类上调用具有String类型入参和Instrumentation类型入参的premain方法;

如果JavaAgentMain类没有实现带有具有String类型入参和Instrumentation类型入参的premain方法,Java虚拟机调用只包含String类型入参的premain方法;

把JavaAgentMain类所在的路径信息配置到MANIFEST.MF文件中,其中MANIFEST.MF文件用于在Java程序中用来定义扩展或档案打包相关数据。

可选地,所述通过ByteCodeTransformer类,利用ASM框架实现字节码的操作逻辑,包括:

通过ByteCodeTransformer类,利用ASM框架内提供的操作类ClassReader、ClassWriter和ClassVisitor实现字节码的操作逻辑。

可选地,所述通过ByteCodeMethodVisitor类以字节码方式解析Java方法的信息,包括:

在Java程序加载启动的过程中,监控所有类的所有Java方法,获取到所有类的名称、方法名称、入参类型、入参值、返回类型以及方法返回值,其中入参类型、入参值、返回类型以及方法返回值被ASM框架描述为一段固定的字符串;

根据ASM框架官方文档对这段固定的字符串的说明,利用正则表达式对入参类型、入参值、返回类型以及方法返回值的字符串进行解析;

利用解析得到的方法信息,生成被监控的Java方法全局唯一的标识ID。

可选地,所述进入被监控的Java方法并对字节码进行增强,包括:

通过在继承父类AdviceAdapter的子类ByteCodeMethodVisitor中,重写onMethodEnter方法,用于在进入被监控的Java方法时设置开始时间;

使用字节码将设置开始时间的逻辑插桩到被监控的Java方法进入时的开始处;

使用字节码创建并初始化一个与被监控的Java方法入参数量相同容量的对象类型数组;

把被监控的Java方法的全部入参信息通过字节码添加到创建的对象类型数组中。

可选地,所述当被监控的Java方法逻辑执行完毕时,结束Java方法并对字节码进行增强,得到Java方法执行时监控到的关键信息,包括:

当被监控的Java方法逻辑执行完毕时,结束Java方法,确定方法执行耗时;

重写onMethodExit方法,使用字节码获取类名称、方法名称、入参类型、入参值、返回类型、方法返回值以及方法执行耗时并输出到外部,作为Java方法执行时监控到的关键信息。

根据本发明的又一个方面,提供了一种基于ASM字节码插桩的非入侵准实时监控系统,包括:

关键信息采集及传输模块,用于通过JavaAgent技术和ASM框架,以非入侵方式采集被监控的Java方法执行过程中的关键信息,并将采集到的关键信息传输至基于RocketMQ实现的消息队列;

关键信息发送模块,用于通过基于RocketMQ实现的消息队列将关键信息发送至监控服务平台后端程序;

关键信息存储模块,用于通过监控服务平台后端程序对消息队列的关键信息进行消费和持久化处理,存入RDBMS关系型数据库;

关键信息分析模块,用于利用ElasticSearch引擎从RDBMS关系型数据库获取关键信息进行准实时搜索和分析;

可视化展示模块,用于将分析得到的结果通过ECharts可视化工具展示到监控服务平台的前端页面。

根据本发明的又一个方面,提供了一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行本发明上述任一方面所述的方法。

根据本发明的又一个方面,提供了一种电子设备,所述电子设备包括:处理器;用于存储所述处理器可执行指令的存储器;所述处理器,用于从所述存储器中读取所述可执行指令,并执行所述指令以实现本发明上述任一方面所述的方法。

本发明使用JavaAgent技术结合ASM框架对被监控的Java方法实现字节码增强,以非侵入的方式对方法执行过程中类名称、方法名称、入参类型、入参值、返回类型、返回值和方法执行耗时等关键信息进行采集和传输,从而完成Java程序的全链路监控,并能够以量化数据验证Java工程的代码质量。Java程序的关键信息完成采集后,直接压入基于RocketMQ实现的消息队列,由监控服务平台进行队列信息的消费,最终持久化存储到关系型数据库RDBMS,同时利用ElasticSearch实现准实时的监控信息搜索和分析,分析的结果通过监控服务平台前端页面基于ECharts实现可视化展示,实现准实时、高可用、高性能的监控数据分析展示。

附图说明

通过参考下面的附图,可以更为完整地理解本发明的示例性实施方式:

图1是本发明一示例性实施例提供的基于ASM字节码插桩的非入侵准实时监控方法的流程示意图;

图2是本发明一示例性实施例提供的字节码插桩方案流程图;

图3是本发明一示例性实施例提供的字节码插桩效果示例;

图4是本发明一示例性实施例提供的字节码插桩整体架构图;

图5是本发明一示例性实施例提供的基于ASM字节码插桩的非入侵准实时监控系统的结构示意图;

图6是本发明一示例性实施例提供的电子设备的结构。

具体实施方式

下面,将参考附图详细地描述根据本发明的示例实施例。显然,所描述的实施例仅仅是本发明的一部分实施例,而不是本发明的全部实施例,应理解,本发明不受这里描述的示例实施例的限制。

应注意到:除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对布置、数字表达式和数值不限制本发明的范围。

图1示出了本发明所提供的基于ASM字节码插桩的非入侵准实时监控方法的流程示意图。如图1所示,基于ASM字节码插桩的非入侵准实时监控方法,包括:

步骤S10:通过JavaAgent技术和ASM框架,以非入侵方式采集被监控的Java方法执行过程中的关键信息,并将采集到的关键信息传输至基于RocketMQ实现的消息队列;

在本发明实施例中,如图2所示的字节码插桩方案流程图,为实现统一的非入侵式监控服务,本发明提出在代码加载时以字节码插桩的方式对被监控的程序方法完成增强处理,在不影响原有程序逻辑的前提下,采集监控所需的必要信息并通过RocketMQ(一款开源低延迟、高并发、高可用、高可靠的分布式消息中间件)消息队列发送到监控服务平台后端程序,搭配ElasticSearch(一款开源分布式搜索和分析引擎)进行准实时搜索和分析,并将结果通过可视化工具ECharts(一款开源数据可视化图表库)展示到监控服务平台前端页面,帮助用户快速、直观地观测各个系统服务运行时的状态信息,提供了一套完整的高可用、高性能、准实时、可视化监控服务平台方案。

本发明提出一种基于ASM(一款Java字节码操控框架)字节码插桩的非入侵准实时监控系统与方法,利用ASM字节码框架对程序代码的字节码实现增强处理,完成程序运行时对代码方法执行情况的信息采集。如图3字节码插桩效果示例。

具体为,通过JavaAgent技术和ASM框架实现Java方法执行时的信息抓取,具体包括:类名称、方法名称、入参类型、入参值、返回类型、返回值以及方法执行耗时。JavaAgent是一种探针技术,通过premain方法在类加载的过程中,对指定方法进行字节码增强。由于Java类都是先转换为字节码指令再执行,所以使用JavaAgent探针技术增强后的方法,可以根据需求任意输出所需的监控信息,与缺点非常明显的侵入式硬编码监控代码达到相同效果。ASM是一个Java字节码处理框架,具有动态生成类或者增强已存在类的能力。ASM可以直接生成二进制的class文件(一种可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件),并支持在类被加载到Java虚拟机之前动态改变类的行为。由于Java的类编译后是被存储在严格格式定义的class后缀文件中,而这些class文件拥有完善的元数据可以用来解析类中的元素,比如类名称、方法、属性和Java字节码指令等。因此,ASM从class后缀文件中读取信息后,就可以改变类的行为、分析类的信息,还可以根据业务的需要生成新类。也就是说,ASM是通过直接修改字节码来达到修改class文件的目的。

可选地,所述通过JavaAgent技术和ASM框架,以非入侵方式采集被监控的Java方法执行过程中的关键信息,包括:通过JavaAgentMain类实现JavaAgent程序的入口功能;通过ByteCodeTransformer类,利用ASM框架实现字节码的操作逻辑;通过ByteCodeMethodVisitor类以字节码方式解析Java方法的信息;进入被监控的Java方法并对字节码进行增强;当被监控的Java方法逻辑执行完毕时,结束Java方法并对字节码进行增强,得到Java方法执行时监控到的关键信息。

可选地,所述通过JavaAgentMain类实现JavaAgent程序的入口功能,包括:在Java程序运行时,Java虚拟机在JavaAgentMain类上调用具有String类型入参和Instrumentation类型入参的premain方法;如果JavaAgentMain类没有实现带有具有String类型入参和Instrumentation类型入参的premain方法,Java虚拟机调用只包含String类型入参的premain方法;把JavaAgentMain类所在的路径信息配置到MANIFEST.MF文件中,其中MANIFEST.MF文件用于在Java程序中用来定义扩展或档案打包相关数据。

在本发明实施例中,通过JavaAgentMain类实现JavaAgent程序的入口功能,该类是JavaAgent技术固定的入口方法类,所有JavaAgent程序都从这里开始。具体逻辑为:Java程序运行时Java虚拟机先尝试在JavaAgentMain类上调用具有String类型入参和Instrumentation类型入参的premain方法,如果JavaAgentMain类没有实现带有这两个入参的premain方法,则Java虚拟机会尝试调用只包含String类型入参的premain方法。此外,还需要把JavaAgentMain类所在的路径信息配置到MANIFEST.MF文件(在Java中用来定义扩展或档案打包相关数据)中。

可选地,所述通过ByteCodeTransformer类,利用ASM框架实现字节码的操作逻辑,包括:通过ByteCodeTransformer类,利用ASM框架内提供的操作类ClassReader、ClassWriter和ClassVisitor实现字节码的操作逻辑。

在本发明实施例中,通过ByteCodeTransformer类实现字节码的处理,对其传入需要进行监控的类的类加载器、类名称、字节码等信息,进行字节码的增强操作。此类会利用ASM框架进行字节码处理,主要使用框架内提供的操作类ClassReader、ClassWriter和ClassVisitor实现处理逻辑。

可选地,所述通过ByteCodeMethodVisitor类以字节码方式解析Java方法的信息,包括:在Java程序加载启动的过程中,监控所有类的所有Java方法,获取到所有类的名称、方法名称、入参类型、入参值、返回类型以及方法返回值,其中入参类型、入参值、返回类型以及方法返回值被ASM框架描述为一段固定的字符串;根据ASM框架官方文档对这段固定的字符串的说明,利用正则表达式对入参类型、入参值、返回类型以及方法返回值的字符串进行解析;利用解析得到的方法信息,生成被监控的Java方法全局唯一的标识ID。

在本发明实施例中,通过ByteCodeMethodVisitor类以字节码实现Java方法的解析,在Java程序加载启动的过程中,所有类的所有方法都可以被监控到,在这个阶段能够获取到类的名称、方法的名称、方法入参、方法返回值等信息。为了避免后续监控逻辑的各个处理位置,会重复传参获取被监控方法导致资源浪费的问题,此处设计的逻辑是为每个方法生成一个全局唯一ID,处理监控逻辑时可以通过这个ID直接定位到相应方法以提升性能。由于被监控方法的入参信息和返回信息会被ASM框架描述为一段固定的字符串,为方便入参信息和返回信息的解析,需要对该字符串进行拆解匹配。具体逻辑为:根据ASM官方文档对这类固定字符串的说明,利用正则表达式对入参和返回值的字符串进行拆解匹配,先获取入参类型和返回类型,之后处理入参信息和返回信息保存的具体值,并将Java的8个基本类型通过类型转换变为Java对象填充到只能保存对象类型的数组中,用于后续结果的输出。接下来,利用前面解析出来的方法信息,比如入参信息、返回信息等生成该方法全局唯一的标识ID,保证每一个方法都有一个这样的ID。值得一提的是,对于这样的原子性自增ID,可以利用Java自带的AtomicInteger(一个支持原子操作的Integer类)类型进行定义,此外还需再定义一个AtomicReferenceArray(一个支持对底层引用数组变量原子操作的类)类型的集合,此后每添加一个方法,就利用这段逻辑生成一个对应的ID并返回,再存放到集合中。由于全部ID的生成是一次性完成,因此不会影响到采集监控信息时的执行耗时。

可选地,所述进入被监控的Java方法并对字节码进行增强,包括:通过在继承父类AdviceAdapter的子类ByteCodeMethodVisitor中,重写onMethodEnter方法,用于在进入被监控的Java方法时设置开始时间;使用字节码将设置开始时间的逻辑插桩到被监控的Java方法进入时的开始处;使用字节码创建并初始化一个与被监控的Java方法入参数量相同容量的对象类型数组;把被监控的Java方法的全部入参信息通过字节码添加到创建的对象类型数组中。

在本发明实施例中,需要进入被监控的Java方法并对字节码增强的环节。通过在继承父类AdviceAdapter的子类ByteCodeMethodVisitor中,重写onMethodEnter方法,用于在进入方法时设置开始时间,并收集入参信息到数组中。核心逻辑是先使用字节码创建数组,然后把方法的全部入参信息通过字节码添加到该数组,相当于编写Java代码时,先定义数组,再设置参数的处理。具体原理是:先使用字节码将“设置开始时间”的逻辑插桩到方法进入时的开始处,再使用字节码创建并初始化一个与方法入参数量相同容量的对象类型数组,最后依然通过字节码对该数组进行入参信息的添加赋值。赋值的过程包含了将Java基本类型转换为对象类型的动作,因为只有对象类型才被允许存放到对象类型的数组中,而Java的基本类型全都不是对象类型。这个环节利用ASM框架使用的具体字节码指令包括:LSTORE、BIPUSH、ANEWARRAY、ILOAD、INVOKESTATIC和AASTOR E等。其中LSTORE负责将栈顶long类型值保存到局部变量indexbyte中;BI PUSH负责valuebyte值带符号扩展成int值入栈;ANEWARRAY负责创建引用类型的数组;ILOAD负责从局部变量indexbyte中装载int类型值入栈;IN VOKESTATIC负责调用静态方法;AASTORE负责将栈顶引用类型值保存到指定引用类型数组的指定项。到此,就将入参信息添加到数组中了,以供后续把参数信息输出到外部。

可选地,所述当被监控的Java方法逻辑执行完毕时,结束Java方法并对字节码进行增强,得到Java方法执行时监控到的关键信息,包括:当被监控的Java方法逻辑执行完毕时,结束Java方法,确定方法执行耗时;重写onMethodExit方法,使用字节码获取类名称、方法名称、入参类型、入参值、返回类型、方法返回值以及方法执行耗时并输出到外部,作为Java方法执行时监控到的关键信息。

在本发明实施例中,当被监控的Java方法逻辑执行完毕时,就到了结束Java方法并对字节码增强的环节,核心逻辑是通过重写onMethodExit方法,使用字节码获取返回信息输出到外部。这个环节利用ASM框架使用的具体字节码指令包括:LLOAD、LDC、ALOAD、INVOKESTATIC等。其中LLOAD负责从局部变量indexbyte中装载long类型值入栈,对应到本发明的监控逻辑就是加载方法的启动时间;LDC负责将常量池中保存的常量值入栈,对应到本发明的监控逻辑就是加载方法的唯一ID;ALOAD搭配入参信息的内容标记,负责从局部变量indexbyte中装载引用类型值入栈,对应到本发明的监控逻辑就是加载保存有入参信息的数组;ALOAD搭配返回信息的内容标记,加载的是方法返回信息;INVOKESTATIC负责调用静态方法输出结果信息。到此,就具备通过获取方法ID输出类名称、方法名称、入参类型、入参值、返回类型、返回值以及方法执行耗时等监控信息的能力。

步骤S20:通过基于RocketMQ实现的消息队列将关键信息发送至监控服务平台后端程序;

步骤S30:通过监控服务平台后端程序对消息队列的关键信息进行消费和持久化处理,存入RDBMS关系型数据库;

步骤S40:利用ElasticSearch引擎从RDBMS关系型数据库获取关键信息进行准实时搜索和分析;

步骤S50:将分析得到的结果通过ECharts可视化工具展示到监控服务平台的前端页面。

在本发明实施例中,如图4所示的字节码插桩整体架构图,将Java监控代码编译打包为jar后缀类型的文件,启动需要被监控的Java程序时添加JavaAgent参数并指定监控代码的jar类型文件,就可以对被监控的Java程序进行字节码插桩实现方法增强,将执行时监控到的信息输出到基于RocketMQ实现的消息队列,之后监控服务平台后端程序对消息队列的数据进行消费和持久化处理,存入ElasticSearch和RDBMS(关系型数据库),获取监控信息进行准实时搜索和分析,将结果展示到监控服务平台前端页面,快速、方便地完成整个监控过程的实现。

本发明以字节码插桩的方式非入侵地实现Java程序监控信息采集和传输,可以大大保障被监控系统与监控代码之间的独立性、扩展性和稳定性,使监控代码具备非常灵活的迁移能力,支持快速接入任何一个Java技术开发的应用系统。基于ASM框架实现的字节码插桩在性能表现上也十分优异,虽然除了ASM之外,Javassist、Byte-buddy等技术都具有操作字节码的能力,而且在技术实现上甚至比ASM更为简单,但它们的执行效率却低于ASM,这其中最主要的原因就是ASM框架是直接使用指令来控制字节码。同时,Java程序运行过程中采集到的监控信息直接压入性能出色的RocketMQ消息队列,利用ElasticSearch分布式集群完成搜索和分析,搭配ECharts可视化工具即可轻松实现准实时、高可用、高性能的监控数据分析展示。

示例性系统

图5是本发明一示例性实施例提供的基于ASM字节码插桩的非入侵准实时监控系统的结构示意图。如图5所示,系统500包括:

关键信息采集及传输模块510,用于通过JavaAgent技术和ASM框架,以非入侵方式采集被监控的Java方法执行过程中的关键信息,并将采集到的关键信息传输至基于RocketMQ实现的消息队列;

关键信息发送模块520,用于通过基于RocketMQ实现的消息队列将关键信息发送至监控服务平台后端程序;

关键信息存储模块530,用于通过监控服务平台后端程序对消息队列的关键信息进行消费和持久化处理,存入RDBMS关系型数据库;

关键信息分析模块540,用于利用ElasticSearch引擎从RDBMS关系型数据库获取关键信息进行准实时搜索和分析;

可视化展示模块550,用于将分析得到的结果通过ECharts可视化工具展示到监控服务平台的前端页面。

本发明的实施例的基于ASM字节码插桩的非入侵准实时监控系统与本发明的另一个实施例的基于ASM字节码插桩的非入侵准实时监控方法相对应,在此不再赘述。

示例性电子设备

图6是本发明一示例性实施例提供的电子设备的结构。如图6所示,电子设备60包括一个或多个处理器61和存储器62。

处理器61可以是中央处理单元(CPU)或者具有数据处理能力和/或指令执行能力的其他形式的处理单元,并且可以控制电子设备中的其他组件以执行期望的功能。

存储器62可以包括一个或多个计算机程序产品,所述计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。所述易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。所述非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。在所述计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器61可以运行所述程序指令,以实现上文所述的本发明的各个实施例的软件程序的对历史变更记录进行信息挖掘的方法以及/或者其他期望的功能。在一个示例中,电子设备还可以包括:输入装置63和输出装置64,这些组件通过总线系统和/或其他形式的连接机构(未示出)互连。

此外,该输入装置63还可以包括例如键盘、鼠标等等。

该输出装置64可以向外部输出各种信息。该输出装置64可以包括例如显示器、扬声器、打印机、以及通信网络及其所连接的远程输出设备等等。

当然,为了简化,图6中仅示出了该电子设备中与本发明有关的组件中的一些,省略了诸如总线、输入/输出接口等等的组件。除此之外,根据具体应用情况,电子设备还可以包括任何其他适当的组件。

示例性计算机程序产品和计算机可读存储介质

除了上述方法和设备以外,本发明的实施例还可以是计算机程序产品,其包括计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行本说明书上述“示例性方法”部分中描述的根据本发明各种实施例的方法中的步骤。

所述计算机程序产品可以以一种或多种程序设计语言的任意组合来编写用于执行本发明实施例操作的程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。

此外,本发明的实施例还可以是计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行本说明书上述“示例性方法”部分中描述的根据本发明各种实施例的对历史变更记录进行信息挖掘的方法中的步骤。

所述计算机可读存储介质可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以包括但不限于电、磁、光、电磁、红外线、或半导体的系统、系统或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。

以上结合具体实施例描述了本发明的基本原理,但是,需要指出的是,在本发明中提及的优点、优势、效果等仅是示例而非限制,不能认为这些优点、优势、效果等是本发明的各个实施例必须具备的。另外,上述公开的具体细节仅是为了示例的作用和便于理解的作用,而非限制,上述细节并不限制本发明为必须采用上述具体的细节来实现。

本说明书中各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似的部分相互参见即可。对于系统实施例而言,由于其与方法实施例基本对应,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本发明中涉及的器件、系统、设备、系统的方框图仅作为例示性的例子并且不意图要求或暗示必须按照方框图示出的方式进行连接、布置、配置。如本领域技术人员将认识到的,可以按任意方式连接、布置、配置这些器件、系统、设备、系统。诸如“包括”、“包含”、“具有”等等的词语是开放性词汇,指“包括但不限于”,且可与其互换使用。这里所使用的词汇“或”和“和”指词汇“和/或”,且可与其互换使用,除非上下文明确指示不是如此。这里所使用的词汇“诸如”指词组“诸如但不限于”,且可与其互换使用。

可能以许多方式来实现本发明的方法和系统。例如,可通过软件、硬件、固件或者软件、硬件、固件的任何组合来实现本发明的方法和系统。用于所述方法的步骤的上述顺序仅是为了进行说明,本发明的方法的步骤不限于以上具体描述的顺序,除非以其它方式特别说明。此外,在一些实施例中,还可将本发明实施为记录在记录介质中的程序,这些程序包括用于实现根据本发明的方法的机器可读指令。因而,本发明还覆盖存储用于执行根据本发明的方法的程序的记录介质。

还需要指出的是,在本发明的系统、设备和方法中,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本发明的等效方案。提供所公开的方面的以上描述以使本领域的任何技术人员能够做出或者使用本发明。对这些方面的各种修改对于本领域技术人员而言是非常显而易见的,并且在此定义的一般原理可以应用于其他方面而不脱离本发明的范围。因此,本发明不意图被限制到在此示出的方面,而是按照与在此公开的原理和新颖的特征一致的最宽范围。

为了例示和描述的目的已经给出了以上描述。此外,此描述不意图将本发明的实施例限制到在此公开的形式。尽管以上已经讨论了多个示例方面和实施例,但是本领域技术人员将认识到其某些变型、修改、改变、添加和子组合。

相关技术
  • 一种基于ASM字节码插桩实现点击防抖的方法及装置
  • 基于字节码插桩的Android程序监控系统及方法
技术分类

06120116483383