CN101957766B - 一种字节码织入方法、装置及系统 - Google Patents
一种字节码织入方法、装置及系统 Download PDFInfo
- Publication number
- CN101957766B CN101957766B CN201010284154.XA CN201010284154A CN101957766B CN 101957766 B CN101957766 B CN 101957766B CN 201010284154 A CN201010284154 A CN 201010284154A CN 101957766 B CN101957766 B CN 101957766B
- Authority
- CN
- China
- Prior art keywords
- bytecode
- byte code
- type
- subclass
- class
- 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
Abstract
本申请公开了一种字节码织入方法、装置及系统,包括:监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码文件;依据所述字节码织入指令织入事件源的子类字节码文件;对所述子类字节码文件进行缓存,并建立所述子类字节码文件与事件源字节码文件的对应关系;当启动或激活程序时,根据所述对应关系应用自定义类加载器对织入的子类字节码文件进行加载,实现需要织入的程序功能。本申请实施例提供一种字节码织入方法装置及系统,在不改变源代码行数的前提下,为源文件字节码织入子类字节码文件,程序运行时,调用自定义类加载容器,加载织入的子类字节码文件,通过对子类字节码文件的运行,实现需要织入的程序功能。
Description
技术领域
本申请涉及一种字节码织入的技术,具体涉及一种使用在Java程序运行时动态织入字节码的技术。
背景技术
Java字节码(bytecode)是Java虚拟机可执行的指令集的一种表现形式,Java编译器把Java源代码编译成字节码,Java跨平台是基于相同的字节码规范实现不同平台的虚拟机,Java程序编译成字节码后就可以在不同的平台执行。
ASM是一套Java字节码生成器,它可以动态生成二进制格式的stub类或其他代理类,或者动态的修改类字节码文件。
为了能够让由开发人员已经开发好并打包完成的程序在运行时拥有某些特殊的、在打包之前没有的功能,比如实现面向切面编程(AOP Aspect OrientedProgramming),或者开发人员开发的程序需要特定容器支持,则必须要对字节码使用ASM进行重新织入。这个过程一般在编译完成之后,程序打包之前完成。
发明人经过研究发现,在源字节码文件上进行新的字节码织入后,字节码文件中的行数与源程序文件行数不对应,导致程序调试时执行代码的行数与源代码错位,导致程序无法调试。
发明内容
为解决上述技术问题,本申请实施例提供一种字节码织入方法、装置及系统,在不改变源字节码文件的前提下,为源文件字节码织入子类字节码文件,程序运行时,调用自定义类加载容器,加载织入的子类字节码文件,通过对子类字节码文件的运行,实现需要织入的程序功能。
技术方案如下:
一种字节码织入方法,包括:
监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码文件;
依据所述字节码织入指令织入事件源的子类字节码文件;
对所述子类字节码文件进行缓存,并建立所述子类字节码文件与事件源字节码文件的对应关系;
当启动或激活程序时,根据所述对应关系应用自定义类加载器对织入的子类字节码文件进行加载,实现需要织入的程序功能。
上述的织入方法,优选的,所述字节码织入指令中包含织入字节码实现程序功能的功能信息。
上述的织入方法,优选的,所述应用自定义类加载器对织入的子类字节码文件进行加载的过程具体为:
判断需要加载的子类字节码文件所在类的归属类型;
根据所述归属类型选择与其相对应的类加载方式;
应用自定义类加载器根据所述类加载方式对所述类中的子类字节码文件进行加载。
一种字节码织入装置,包括:事件监听获取单元、字节码织入单元、缓存单元和加载单元;
其中:所述事件监听获取单元用于监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码文件;
所述字节码织入单元用于依据所述事件监听获取单元获取的事件源的字节码织入指令织入事件源的子类字节码文件;
所述缓存单元用于对所述字节码织入单元织入的子类字节码文件进行缓存,并建立所述子类字节码文件与事件源字节码文件的对应关系;
所述加载单元用于当启动或激活程序时,根据所述缓存单元建立的对应关系,应用自定义类加载器对所述字节码织入单元织入的子类字节码文件进行加载,实现需要织入的程序功能。
上述的织入装置,优选的,所述事件监听单元获取的字节码织入指令中包含织入字节码实现程序功能的功能信息。
上述的织入装置,优选的,所述加载单元包括:类型判断单元和加载方式选择单元;
所述类型判断单元用于对需要加载的子类字节码文件的归属类型进行判断;
所述加载方式选择单元用于根据所述类型判断单元判断的归属类型选择与所述归属类型相对应的类加载方式。
一种字节码织入系统,包括客户端、应用端及一种字节码织入装置。
由以上本申请实施例提供的技术方案可见,本发明提供的字节码织入方法、装置及系统,在程序部署事件需要织入字节码实现增加的功能的时,对事件源的字节码文件织入一个子类字节码文件,该子类字节码文件可以实现程序要增加的功能,对子类字节码文件进行缓存,并建立子类字节码文件与源字节码文件之间的对应关系,当运行程序时,根据该对应关系,调用自定义类加载器,对子类字节码文件进行加载,以实现需要织入的程序功能,该方法中,织入的字节码类型与源文件类型一致,使得织入的类属性和方法既与源文件类型一致,又增加了新的功能代码,与源文件的结构和行数一致,从而不影响程序代码的调试。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的实现字节码织入方法的流程图;
图2为本申请实施例提供的字节码织入方法的详细流程图;
图3为本申请实施例提供的对字节码进行加载的流程图;
图4为本申请实施例提供的对字节码进行加载的详细流程图;
图5为本申请实施例提供的字节码织入装置的结构示意图;
图6为本申请实施例提供的字节码织入装置的一详细结构示意图;
图7为本申请实施例提供的字节码织入系统的结构图示意图。
具体实施方式
本申请实施例提供一种字节码织入方法、装置及系统,为源文件字节码文件织入一个子类字节码文件,建立子类字节码文件与源文件字节码文件的对应关系,通过对子类字节码文件的运行实现需要织入的功能。
以上是本申请的核心思想,为了使本技术领域的人员更好地理解本申请方案。下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
本申请实施例提供的字节码织入方法的流程图如图1所示,包括:
步骤S101:监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码文件;
步骤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用于对字节码织入过程进行具体化实施。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。以上所述仅是本申请的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。
Claims (4)
1.一种字节码织入方法,其特征在于,包括:
监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码文件;
依据所述字节码织入指令以及ASM技术织入事件源的子类字节码文件;
对所述子类字节码文件进行缓存,并建立所述子类字节码文件与事件源字节码文件的对应关系;
当启动或激活程序时,根据所述对应关系判断需要加载的子类字节码文件所在类的归属类型;根据上述归属类型选择与其相对应的类加载方式;应用自定义类加载器根据所述类加载方式对所述类中的子类字节码文件进行加载,实现需要织入的程序功能;
其中,所述根据所述对应关系判断需要加载的子类字节码文件所在类的归属类型;根据上述归属类型选择与其相对应的类加载方式;应用自定义类加载器根据所述类加载方式对所述类中的子类字节码文件进行加载,包括:
判断是否是织入过的字节码所在类的类型,当是织入过的字节码所在类的类型时,从缓存的字节码中加载需要的字节码;当不是织入过的字节码所在类的类型时,判断是否是容器中的类型;
当是容器中的类型时,采用双亲委托机制加载类;当不是容器中的类型时,判断是否是程序中的类型;
当是程序中的类型时,使用程序中的类加载器加载类;当不是程序中的类型时,使用第三方类库加载类。
2.根据权利要求1所述的织入方法,其特征在于,所述字节码织入指令中包含织入字节码实现程序功能的功能信息。
3.一种字节码织入装置,其特征在于,包括:事件监听获取单元、字节码织入单元、缓存单元和加载单元;
其中:所述事件监听获取单元用于监听程序部署事件,获取事件源的字节码织入指令及事件源的字节码文件;
所述字节码织入单元用于依据所述事件监听获取单元获取的事件源的字节码织入指令以及ASM技术织入事件源的子类字节码文件;
所述缓存单元用于对所述字节码织入单元织入的子类字节码文件进行缓存,并建立所述子类字节码文件与事件源字节码文件的对应关系;
所述加载单元用于当启动或激活程序时,根据所述对应关系判断需要加载的子类字节码文件所在类的归属类型;根据上述归属类型选择与其相对应的类加载方式;应用自定义类加载器根据所述类加载方式对所述类中的子类字节码文件进行加载,实现需要织入的程序功能;
其中,所述根据所述对应关系判断需要加载的子类字节码文件所在类的归属类型;根据上述归属类型选择与其相对应的类加载方式;应用自定义类加载器根据所述类加载方式对所述类中的子类字节码文件进行加载,包括:
判断是否是织入过的字节码所在类的类型,当是织入过的字节码所在类的类型时,从缓存的字节码中加载需要的字节码;当不是织入过的字节码所在类的类型时,判断是否是容器中的类型;
当是容器中的类型时,采用双亲委托机制加载类;当不是容器中的类型时,判断是否是程序中的类型;
当是程序中的类型时,使用程序中的类加载器加载类;当不是程序中的类型时,使用第三方类库加载类。
4.根据权利要求3所述的织入装置,其特征在于,所述事件监听单元获取的字节码织入指令中包含织入字节码实现程序功能的功能信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010284154.XA CN101957766B (zh) | 2010-09-17 | 2010-09-17 | 一种字节码织入方法、装置及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010284154.XA CN101957766B (zh) | 2010-09-17 | 2010-09-17 | 一种字节码织入方法、装置及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101957766A CN101957766A (zh) | 2011-01-26 |
CN101957766B true CN101957766B (zh) | 2014-07-09 |
Family
ID=43485108
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010284154.XA Active CN101957766B (zh) | 2010-09-17 | 2010-09-17 | 一种字节码织入方法、装置及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101957766B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105337978A (zh) * | 2015-11-17 | 2016-02-17 | 浪潮(北京)电子信息产业有限公司 | 一种基于安全服务阻断的切面权限验证方法及系统 |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TW201419024A (zh) * | 2012-11-06 | 2014-05-16 | Inst Information Industry | 應用程式的安全處理方法與安全處理系統 |
CN103902346B (zh) * | 2012-12-27 | 2017-09-29 | 上海鼎为电子科技(集团)有限公司 | 预编译中模拟宏控的实现方法及装置 |
CN105446712B (zh) * | 2014-08-08 | 2020-04-03 | 阿里巴巴集团控股有限公司 | 一种应用程序缺陷修补方法及装置 |
CN105824665B (zh) * | 2016-03-14 | 2019-12-17 | 武汉工程大学 | 一种JavaScript程序中方面的织入方法及系统 |
CN109445807A (zh) * | 2017-08-28 | 2019-03-08 | 腾讯科技(深圳)有限公司 | 实现应用程序更新的方法、装置和计算机可读存储介质 |
CN109684027B (zh) * | 2017-10-18 | 2020-11-24 | 北京京东尚科信息技术有限公司 | 动态跟踪Java虚拟机运行的方法和装置 |
CN111324469A (zh) * | 2020-01-20 | 2020-06-23 | 天津美腾科技股份有限公司 | 偏向应用的结构优化的分布式事件中心的方法及系统 |
CN114861230B (zh) * | 2022-07-07 | 2022-11-01 | 支付宝(杭州)信息技术有限公司 | 终端设备中的隐私防护方法和装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101276271A (zh) * | 2007-03-29 | 2008-10-01 | 北京邮电大学 | 一种面向切面编程的拦截器系统及方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8020143B2 (en) * | 2007-01-10 | 2011-09-13 | International Business Machines Corporation | Remote aspect advising for an aspect-oriented program |
US9910688B2 (en) * | 2008-11-28 | 2018-03-06 | Red Hat, Inc. | Implementing aspects with callbacks in virtual machines |
-
2010
- 2010-09-17 CN CN201010284154.XA patent/CN101957766B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101276271A (zh) * | 2007-03-29 | 2008-10-01 | 北京邮电大学 | 一种面向切面编程的拦截器系统及方法 |
Non-Patent Citations (2)
Title |
---|
基于运行时验证的AOP程序检测框架研究;梁睿;《中国优秀硕士学位论文全文数据库》;20100115;I138-107 * |
梁睿.基于运行时验证的AOP程序检测框架研究.《中国优秀硕士学位论文全文数据库》.2010,I138-107. |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105337978A (zh) * | 2015-11-17 | 2016-02-17 | 浪潮(北京)电子信息产业有限公司 | 一种基于安全服务阻断的切面权限验证方法及系统 |
CN105337978B (zh) * | 2015-11-17 | 2019-01-22 | 浪潮(北京)电子信息产业有限公司 | 一种基于安全服务阻断的切面权限验证方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN101957766A (zh) | 2011-01-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101957766B (zh) | 一种字节码织入方法、装置及系统 | |
CN109491695B (zh) | 一种集成安卓应用的增量更新方法 | |
US11354144B2 (en) | Java native interface and windows universal app hooking | |
EP3134809B1 (en) | Manual refinement of specialized classes | |
JP6122493B2 (ja) | 適応的に移植性を有したライブラリ | |
CN110134378B (zh) | 应用程序创建方法及装置、计算机设备及存储介质 | |
CN106605212B (zh) | 在动态链接的运行时环境中的模块化共同版本管理 | |
CN102402427B (zh) | 一种Java应用程序的更新方法及装置 | |
US8756616B2 (en) | System and method for reducing the static footprint of mixed-language JAVA classes | |
WO2018045733A1 (zh) | 一种安卓系统so文件的加载方法及电子设备 | |
US8381198B2 (en) | Systems, methods and computer program products for safety checking executable application programs in a module | |
CN104731622B (zh) | 一种应用程序的加载方法、装置和移动终端 | |
CN100492387C (zh) | 基于Keil C51的软件保护开发的方法和系统 | |
US9459986B2 (en) | Automatic generation of analysis-equivalent application constructs | |
US8479177B2 (en) | Attribute based method redirection | |
CN104035778A (zh) | 一种Android应用程序开发方法 | |
Sadilek | Prototyping domain-specific languages for wireless sensor networks | |
CN107092472B (zh) | 一种动态发布方法及设备 | |
US10552135B1 (en) | Reducing a size of an application package | |
KR20110114754A (ko) | 에스케이브이엠 및 위피자바 응용프로그램을 안드로이드 응용프로그램으로 변환하는 프로그램을 기록한 컴퓨터로 판독가능한 기록매체 | |
KR20130020135A (ko) | 통합 개발 환경에서의 코드 동시 개발자 리스트 제공 시스템 및 방법 | |
CN115220873A (zh) | 一种在Android系统中运行Open Harmony应用的方法 | |
CN113641389A (zh) | 基于OpenCPU的软件升级方法、装置及设备 | |
Lawall et al. | Tarantula: Killing driver bugs before they hatch | |
WO2019157891A1 (zh) | 应用安装方法、应用安装包的生成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20211206 Address after: 250014 No. 41-1 Qianfo Shandong Road, Lixia District, Jinan City, Shandong Province Patentee after: SHANDONG CIVIC SE COMMERCIAL MIDDLEWARE Co.,Ltd. Address before: 250014 No. 41-1 Qianfo Shandong Road, Jinan City, Shandong Province Patentee before: SHANDONG CVIC SOFTWARE ENGINEERING Co.,Ltd. Patentee before: Shandong Zhongchuang software commercial middleware Co., Ltd |