一种字节码织入方法、装置及系统的制作方法

文档序号:6332182阅读:169来源:国知局
专利名称:一种字节码织入方法、装置及系统的制作方法
技术领域
本申请涉及一种字节码织入的技术,具体涉及一种使用在Java程序运行时动态 织入字节码的技术。
背景技术
Java字节码(bytecode)是Java虚拟机可执行的指令集的一种表现形式,Java编 译器把Java源代码编译成字节码,Java跨平台是基于相同的字节码规范实现不同平台的 虚拟机,Java程序编译成字节码后就可以在不同的平台执行。ASM是一套Java字节码生成器,它可以动态生成二进制格式的stub类或其他代理 类,或者动态的修改类字节码文件。为了能够让由开发人员已经开发好并打包完成的程序在运行时拥有某些特殊的、 在打包之前没有的功能,比如实现面向切面编程(AOP Aspect Oriented Programming),或 者开发人员开发的程序需要特定容器支持,则必须要对字节码使用ASM进行重新织入。这 个过程一般在编译完成之后,程序打包之前完成。发明人经过研究发现,在源字节码文件上进行新的字节码织入后,字节码文件中 的行数与源程序文件行数不对应,导致程序调试时执行代码的行数与源代码错位,导致程 序无法调试。

发明内容
为解决上述技术问题,本申请实施例提供一种字节码织入方法、装置及系统,在不 改变源字节码文件的前提下,为源文件字节码织入子类字节码文件,程序运行时,调用自定 义类加载容器,加载织入的子类字节码文件,通过对子类字节码文件的运行,实现需要织入 的程序功能。技术方案如下一种字节码织入方法,包括监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码文件;依据所述字节码织入指令织入事件源的子类字节码文件;对所述子类字节码文件进行缓存,并建立所述子类字节码文件与事件源字节码文 件的对应关系;当启动或激活程序时,根据所述对应关系应用自定义类加载器对织入的子类字节 码文件进行加载,实现需要织入的程序功能。上述的织入方法,优选的,所述字节码织入指令中包含织入字节码实现程序功能 的功能信息。上述的织入方法,优选的,所述应用自定义类加载器对织入的子类字节码文件进 行加载的过程具体为判断需要加载的子类字节码文件所在类的归属类型;
3
根据所述归属类型选择与其相对应的类加载方式;应用自定义类加载器根据所述类加载方式对所述类中的子类字节码文件进行加载。一种字节码织入装置,包括事件监听获取单元、字节码织入单元、缓存单元和加 载单元;其中所述事件监听获取单元用于监听程序部署事件,获取事件源的字节码织入 指令及事件源的字节码文件;所述字节码织入单元用于依据所述事件监听获取单元获取的事件源的字节码织 入指令织入事件源的子类字节码文件;所述缓存单元用于对所述字节码织入单元织入的子类字节码文件进行缓存,并建 立所述子类字节码文件与事件源字节码文件的对应关系;所述加载单元用于当启动或激活程序时,根据所述缓存单元建立的对应关系,应 用自定义类加载器对所述字节码织入单元织入的子类字节码文件进行加载,实现需要织入 的程序功能。上述的织入装置,优选的,所述事件监听单元获取的字节码织入指令中包含织入 字节码实现程序功能的功能信息。上述的织入装置,优选的,所述加载单元包括类型判断单元和加载方式选择单 元;所述类型判断单元用于对需要加载的子类字节码文件的归属类型进行判断;所述加载方式选择单元用于根据所述类型判断单元判断的归属类型选择与所述 归属类型相对应的类加载方式。—种字节码织入系统,包括客户端、应用端及一种字节码织入装置。由以上本申请实施例提供的技术方案可见,本发明提供的字节码织入方法、装置 及系统,在程序部署事件需要织入字节码实现增加的功能的时,对事件源的字节码文件织 入一个子类字节码文件,该子类字节码文件可以实现程序要增加的功能,对子类字节码文 件进行缓存,并建立子类字节码文件与源字节码文件之间的对应关系,当运行程序时,根据 该对应关系,调用自定义类加载器,对子类字节码文件进行加载,以实现需要织入的程序功 能,该方法中,织入的字节码类型与源文件类型一致,使得织入的类属性和方法既与源文件 类型一致,又增加了新的功能代码,与源文件的结构和行数一致,从而不影响程序代码的调 试ο


为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本 申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下, 还可以根据这些附图获得其他的附图。图1为本申请实施例提供的实现字节码织入方法的流程图;图2为本申请实施例提供的字节码织入方法的详细流程图;图3为本申请实施例提供的对字节码进行加载的流程图4为本申请实施例提供的对字节码进行加载的详细流程图;图5为本申请实施例提供的字节码织入装置的结构示意图;图6为本申请实施例提供的字节码织入装置的一详细结构示意图;图7为本申请实施例提供的字节码织入系统的结构图示意图。
具体实施例方式本申请实施例提供一种字节码织入方法、装置及系统,为源文件字节码文件织入 一个子类字节码文件,建立子类字节码文件与源文件字节码文件的对应关系,通过对子类 字节码文件的运行实现需要织入的功能。以上是本申请的核心思想,为了使本技术领域的人员更好地理解本申请方案。下 面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显 然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实 施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应 当属于本申请保护的范围。本申请实施例提供的字节码织入方法的流程图如图1所示,包括步骤SlOl 监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码 文件;步骤S102 依据字节码织入指令织入事件源的子类字节码文件;步骤S103 对子类字节码文件进行缓存,并建立子类字节码文件与事件源字节码 文件的对应关系;步骤S104 当启动或激活程序时,根据上述对应关系应用自定义类加载器对织入 的子类字节码文件进行加载,实现需要织入的程序功能。需要说明的是,本实施例公开的方法,在程序部署之后进行织入字节码的操作,不 需要在开发和编译期进行字节码织入,织入灵活方便,不需要开发人员使用定制的开发工 具开发程序。当需要对程序进行功能增加时,将需要增加的功能信息以信息指令的形式发送至 执行系统中,系统为源字节码文件建立一个子类,将需要织入的实现程序功能的字节码文 件织入到子类中,建立子类与源字节码文件的关联信息,对子类字节码文件进行缓存,当需 要对程序运行时,运行至关联区域时,调用自定义的类加载容器对织入的子类字节码文件 进行加载并运行,实现需要织入的字节码功能。本申请实施例提供的字节码织入方法的详细流程图如图2所示,包括步骤S201 监听程序部署事件;在程序运行时依赖容器监听程序的部署事件,实时监控部署的程序,并对其进行 检查,看是否需要进行运行时织入,执行步骤S202 ;步骤S202 检查事件源是否需要织入字节码;是,执行步骤S203 ;否则,执行步骤 S206 ;步骤S203 获取事件源的字节码流;步骤S204 织入原类型生成子类字节码;织入的字节码文件,类型为原类型的子类,这样织入的类属性和方法既与原类型一致,而且原类型的结构和行数与源代码一致;步骤S205 对子类字节码进行缓存;步骤S206 启动/激活程序。需要说明的是本发明使用ASM进行代码织入,读物需要织入的字节码流使用ASM 织入代码实现特定的功能,采用ASM进行字节码织入,织入运行效率高,提高了开发人员的 开发效率,运行期织入解除定制开发工具的依赖;生成子类,方便调试;在程序部署之后,加载之前进行字节码织入首先打开事件源的程序字节码文件, 对其进行织入,织入过程中不修改源字节码文件,而是将织入的字节码文件放入指定的缓 存位置,并记录被织入的字节码文件与源字节码文件的对应关系,直至织入过程完成。本申请实施例提供的对字节码进行加载的流程图如图3所示,包括步骤S301 判断需要加载的子类字节码文件所在类的归属类型;步骤S302 根据上述归属类型选择与其相对应的类加载方式;步骤S303 应用自定义类加载器根据所述类加载方式对所述类中的子类字节码 文件进行加载。需要说明的是在程序被激活或者启动之后,使用系统类加载容器无法加载到织 入后的类,所以要实现一个自定义的类加载器,当程序依赖的容器需要加载指定的类时,使 用自定义的类加载器去加载织入后的类来代替程序原有的类,以达到动态加载特殊功能类 的目的。本申请实施例提供的对字节码进行加载的详细流程图如图4所示,包括,步骤S401 判断是否是织入过的字节码所在类的类型,是,执行步骤S402 ;否则, 执行步骤S403 ;步骤S402 从缓存的字节码中加载需要的字节码,加载完毕后执行步骤S408 ;步骤S403 判断是否是容器中的类型,是,执行步骤S404 ;否则,执行步骤S405 ;步骤S404 采用双亲委托机制加载类,加载完毕后执行步骤S408 ;S405 判断是否是程序中的类型;是,执行步骤S406 ;否则执行步骤S407 ;S406 使用程序中的类加载器加载类;执行完毕后执行步骤S408 ;步骤S407 ;使用第三方类库加载类;S408 加载过程结束。需要说明的是容器要正确加载和运行程序中的内容,同时需要加载其他许多类 型的类,这些类可能是容器中的类型、程序中的类型、织入后的类型和其他提供的类型,如 果要加载的类时织入过的类型,则从织入缓存区域查询织入后的字节码文件记载类型;并 且使用其中一方的类加载器作为父类加载器,依赖其他方的类加载器来加载需要加载的类 型。本发明提供的方法,因为是在运行时织入和加载,所以运行时可以从多方类加载器中加 载类型。本申请实施例提供的方法,源字节码文件的类型和行数均不改变,所以,如果原类 型中如果存在Annotation的话,执行过程中,将会完全复制Annotation到其织入后的子类 中,且位置不变,这样,运行程序时,不会因为Annotation丢失出错;本发明提供的方法,其织入过程时在程序运行期织入,织入过程是在程序部署之 后、加载之前,将织入的代码存入缓存文件,不需要修改源字节码文件的内容,因为源程序中的签名内容不发生改变,支持了签名的jar包机制。本申请实施例提供的字节码织入方法、装置及系统,直接为源字节码文件织入子 类字节码,建立子类字节码与源字节码之间的对应关系,不需要对源字节码文件进行修改, 程序运行时,源代码的行数不变,保证了程序的正确运行。本申请实施例提供的字节码织入装置的结构图如图5所示,包括事件监听获取 单元501、字节码织入单元502、缓存单元503和加载单元504 ;其中事件监听获取单元501用于监听程序部署事件,获取事件源的字节码织入 指令及事件源的字节码文件;字节码织入单元502用于依据事件监听获取单元501获取的事件源的字节码织入 指令织入事件源的子类字节码文件;缓存单元503用于对字节码织入单元502织入的子类字节码文件进行缓存,并建 立类字节码文件与事件源字节码文件的对应关系;加载单元504用于当启动或激活程序时,根据缓存单元503建立的对应关系,应用 自定义类加载器对字节码织入单元502织入的子类字节码文件进行加载,实现需要织入的 程序功能。事件监听单元501获取的字节码织入指令中包含织入字节码实现程序功能的功 能信息。本申请实施例提供的字节码织入装置的一详细结构示意图如图6所示,加载单元 504包括类型判断单元601和加载方式选择单元602 ;类型判断单元601用于对需要加载的子类字节码文件的归属类型进行判断;加载方式选择单元602用于根据类型判断单元601判断的归属类型选择与所述归 属类型相对应的类加载方式。本申请实施例提供的字节码织入系统的结构示意图如图7所示,包括客户端 701、应用端703及一种字节码织入装置702 ;其中客户端701用于为用户提供可操作的系统平台;字节码织入装置702用于控制字节码织入过程;应用端703用于对字节码织入过程进行具体化实施。本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部 分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。以上所述仅是本 申请的具体实施方式
,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原 理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。
权利要求
一种字节码织入方法,其特征在于,包括监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码文件;依据所述字节码织入指令织入事件源的子类字节码文件;对所述子类字节码文件进行缓存,并建立所述子类字节码文件与事件源字节码文件的对应关系;当启动或激活程序时,根据所述对应关系应用自定义类加载器对织入的子类字节码文件进行加载,实现需要织入的程序功能。
2.根据权利要求1所述的织入方法,其特征在于,所述字节码织入指令中包含织入字 节码实现程序功能的功能信息。
3.根据权利要求1所述的织入方法,其特征在于,所述应用自定义类加载器对织入的 子类字节码文件进行加载的过程具体为判断需要加载的子类字节码文件所在类的归属类型;根据所述归属类型选择与其相对应的类加载方式;应用自定义类加载器根据所述类加载方式对所述类中的子类字节码文件进行加载。
4.一种字节码织入装置,其特征在于,包括事件监听获取单元、字节码织入单元、缓 存单元和加载单元;其中所述事件监听获取单元用于监听程序部署事件,获取事件源的字节码织入指令 及事件源的字节码文件;所述字节码织入单元用于依据所述事件监听获取单元获取的事件源的字节码织入指 令织入事件源的子类字节码文件;所述缓存单元用于对所述字节码织入单元织入的子类字节码文件进行缓存,并建立所 述子类字节码文件与事件源字节码文件的对应关系;所述加载单元用于当启动或激活程序时,根据所述缓存单元建立的对应关系,应用自 定义类加载器对所述字节码织入单元织入的子类字节码文件进行加载,实现需要织入的程 序功能。
5.根据权利要求4所述的织入装置,其特征在于,所述事件监听单元获取的字节码织 入指令中包含织入字节码实现程序功能的功能信息。
6.根据权利要求4所述的织入装置,其特征在于,所述加载单元包括类型判断单元和 加载方式选择单元;所述类型判断单元用于对需要加载的子类字节码文件所在类的归属类型进行判断;所述加载方式选择单元用于根据所述类型判断单元判断的归属类型选择与所述归属 类型相对应的类加载方式。
7.一种字节码织入系统,其特征在于,包括客户端、应用端及权利要求4 6任一项所 述的一种字节码织入装置。
全文摘要
本申请公开了一种字节码织入方法、装置及系统,包括监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码文件;依据所述字节码织入指令织入事件源的子类字节码文件;对所述子类字节码文件进行缓存,并建立所述子类字节码文件与事件源字节码文件的对应关系;当启动或激活程序时,根据所述对应关系应用自定义类加载器对织入的子类字节码文件进行加载,实现需要织入的程序功能。本申请实施例提供一种字节码织入方法装置及系统,在不改变源代码行数的前提下,为源文件字节码织入子类字节码文件,程序运行时,调用自定义类加载容器,加载织入的子类字节码文件,通过对子类字节码文件的运行,实现需要织入的程序功能。
文档编号G06F9/445GK101957766SQ20101028415
公开日2011年1月26日 申请日期2010年9月17日 优先权日2010年9月17日
发明者刘民, 景新海, 罗佳 申请人:山东中创软件工程股份有限公司;山东中创软件商用中间件股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1