CN112114810A - 编译处理方法及装置 - Google Patents
编译处理方法及装置 Download PDFInfo
- Publication number
- CN112114810A CN112114810A CN202010814991.2A CN202010814991A CN112114810A CN 112114810 A CN112114810 A CN 112114810A CN 202010814991 A CN202010814991 A CN 202010814991A CN 112114810 A CN112114810 A CN 112114810A
- Authority
- CN
- China
- Prior art keywords
- code
- processing
- bytecode
- annotation
- file
- 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.)
- Pending
Links
- 238000003672 processing method Methods 0.000 title claims abstract description 28
- 238000012545 processing Methods 0.000 claims abstract description 139
- 238000000034 method Methods 0.000 claims description 118
- 238000002513 implantation Methods 0.000 claims description 18
- 239000007943 implant Substances 0.000 claims description 11
- 238000004458 analytical method Methods 0.000 claims description 6
- 238000006243 chemical reaction Methods 0.000 claims description 5
- 230000008569 process Effects 0.000 description 27
- 238000010586 diagram Methods 0.000 description 10
- 230000006870 function Effects 0.000 description 10
- 230000006872 improvement Effects 0.000 description 9
- 230000002159 abnormal effect Effects 0.000 description 8
- 238000004590 computer program Methods 0.000 description 7
- 238000005516 engineering process Methods 0.000 description 7
- 239000008186 active pharmaceutical agent Substances 0.000 description 6
- 238000011161 development Methods 0.000 description 5
- 230000008859 change Effects 0.000 description 2
- 239000002131 composite material Substances 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000003252 repetitive effect Effects 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
- 230000006399 behavior Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000005055 memory storage Effects 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 229920001296 polysiloxane Polymers 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 239000003826 tablet Substances 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本说明书实施例提供了一种编译处理方法及装置,其中,一种编译处理方法包括:获取待编译的Java源码文件,以及对所述Java源码文件中的目标代码块进行统计处理的处理代码;扫描所述Java源码文件,获得针对所述目标代码块定义的注解;将所述处理代码中与所述注解对应的处理代码转换为处理字节码;基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件。
Description
技术领域
本申请涉及软件开发技术领域,尤其涉及一种编译处理方法及装置。
背景技术
在软件项目开发过程中,一个项目经常要统计多个方法的耗时、参数记录或者异常记录,这就需要写对应的通用耗时逻辑代码或者参数记录代码来实现。目前,一些通用技术如耗时统计、参数记录、异常记录等在实际中的实现,都是采用硬编码的方式直接修改代码,硬编码方式就是在每个方法前后写入相应的能够实现目标的通用逻辑代码。但是,由于通用代码需要使用的地方很多,手动添加不但耗费时间,而且会导致很多重复代码,使代码量比较大,还会影响代码的整洁程度。
发明内容
本说明书一个或多个实施例提供了一种编译处理方法。所述编译处理方法包括:
获取待编译的Java源码文件,以及对所述Java源码文件中的目标代码块进行统计处理的处理代码;
以及,对所述Java源码文件进行如下编译处理:
对所述Java源码进行编译,在Maven编译的过程中扫描所述Java源码文件,获得针对所述目标代码块定义的注解;
将所述处理代码中与所述注解对应的处理代码转换为处理字节码;
基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件。
可选的,所述基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件,包括:
基于所述注解,调用字节码植入接口将所述处理字节码植入所述源字节码中,其中,所述字节码植入接口包括:ASM的应用程序编程接口。
可选的所述基于所述注解,调用字节码植入接口将所述处理字节码植入所述源字节码中,包括:
基于所述注解,调用字节码读取与分析引擎读取所述处理字节码和所述源字节码;
调用字节码的拼接引擎将所述读取与分析引擎读取到的字节码重写为所述目标代码文件。
可选的,所述目标代码块包括下述至少一项:方法、类、包。
可选的,所述基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件,包括:
针对所述类定义的注解,在所述类包含的每个方法植入所述注解对应的处理字节码;
或者,
针对所述包定义的注解,在所述包包含的每个方法植入所述注解对应的处理字节码。
可选的,所述处理代码,包括下述至少一种:
执行耗时统计代码、执行参数记录代码和执行异常记录代码。
可选的,所述将所述处理代码中与所述注解对应的处理代码转换为处理字节码,包括:
将所述注解对应的执行耗时统计代码转换为耗时统计字节码。
可选的,所述基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件,包括:
针对所述Java源码文件中定义的任意一个耗时统计注解,在该注解所对应的所述代码块中植入所述耗时统计字节码。
可选的,所述将所述注解对应的所述处理代码转换为处理字节码,包括:
调用字节码转换器将所述注解对应的所述处理代码转换为所述处理字节码;
其中,所述字节码转换器包括:ASM中的Byte code outline插件。
可选的,本实施例还提供一种日志框架将所述处理代码的运行结果写入预设存储目录。
本说明书一个或多个实施例提供了一种编译处理装置,包括:
源码获取模块,被配置为获取待编译的Java源码文件,以及对所述Java源码文件中的目标代码块进行统计处理的处理代码;
以及,通过运行如下模块对所述Java源码文件进行编译处理:
扫描模块,被配置为扫描所述Java源码文件,获得针对所述目标代码块定义的注解;
转换模块,被配置为将所述处理代码中与所述注解对应的目标处理代码转换为字节码;
植入模块,被配置为基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述字节码,获得目标代码文件。
本说明书提供的所述编译处理方法,在获取了Java源码文件和需要的统计处理代码所在的代码包的基础上,在编译过程中,将所述统计处理代码转换后获得的处理字节码植入Java源码转换的源字节码中,获得包括所述源字节码以及所述处理字节码的目标代码文件,以此来降低代码编译过程中在所述源码中植入所述统计处理代码的时间,避免针对同样的所述统计处理代码进行重复编程导致的代码量大的问题,在提升编程效率的同时提高了代码的整洁程度,实现了较为快捷的代码编程。
附图说明
为了更清楚地说明本说明书一个或多个实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本说明书一个或多个实施例提供的一种编译处理方法处理流程图;
图2为本说明书一个或多个实施例提供的一种应用于Java编译场景的编译处理方法处理流程图;
图3为本说明书一个或多个实施例提供的一种编译处理装置的示意图。
具体实施方式
为了使本技术领域的人员更好地理解本说明书一个或多个实施例中的技术方案,下面将结合本说明书一个或多个实施例中的附图,对本说明书一个或多个实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本说明书的一部分实施例,而不是全部的实施例。基于本说明书一个或多个实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本文件的保护范围。
本说明书提供的一种编译处理方法实施例:
参照图1,其示出了本实施例提供的一种编译处理方法处理流程图;参照图2,其示出了本实施例提供的一种应用于Java编译场景的编译处理方法处理流程图。
参照图1,本实施例提供的编译处理方法,具体包括步骤S102至步骤S108。
步骤S102,获取待编译的Java源码文件,以及对所述Java源码文件中的目标代码块进行统计处理的处理代码。
实际应用中,开发人员在程序开发的过程中需要对开发过程中编写的源代码进行代码性能的测试或者统计,比如统计代码中一个方法的耗时,参数的记录或者异常值的记录,这就需要添加耗时统计代码,参数记录代码,异常记录代码等进行统计处理的处理代码,但直接输入所述处理代码,不仅耗时耗力,也会使代码出现大量重复内容,影响整个代码的整洁程度,也不利于开发人员或者使用人员查看分析,在一定程度上加大了代码的累赘感。
针对于此,为提升编程效率,使开发人员减少重复编程,并且能更直观地理解程序,本实施例提供的编译处理方法,通过定义注解的方式,将所述统计处理代码写在独立的代码包中,在需要的方法、类或者包中通过编译重写即可实现将所述处理字节码植入所述源字节码中,得到一个包括所述源字节码以及所述处理字节码的目标处理代码,从而,降低代码编程过程中在所述Java源码中植入所述处理代码的时间,避免针对同样的所述处理代码进行重复编程导致的代码量大的问题,在提升编程效率的同时提高了代码的整洁程度,实现了较为快捷的代码编程。
Java是一项用于开发应用程序的技术,它可以让Web变得更实用,本实施例所述Java源码文件,是指采用Java编程语言编写的文本文件,例如,采用Java编程语言编写的Java源代码“.java”文件。
所述目标代码块是Java编程项目中需要被统计处理的代码,包括下述至少一项:方法、类、包。例如,源码文件中一个方法对应的源代码组成的代码块,称之为该方法的目标代码块。
例如,开发人员在程序开发的过程中,需要对开发过程中编写的源代码中某个方法进行耗时统计,此处的目标代码块即为“.java”文件中所述方法对应的源代码组成的代码块;相应的,处理代码为对所述方法进行耗时统计的耗时统计代码。
或者,开发人员在程序开发的过程中,需要对开发过程中编写的某个类进行参数记录,此处的目标代码块即为所述类中的每个方法所在的代码块;相应的,处理代码为对所述类进行参数记录的参数记录代码。
再或者,开发人员在程序开发的过程中,需要对开发过程中编写的某个包进行异常记录,此处的目标代码块即为所述包的每个方法所在的代码块;相应的,处理代码为对所述包进行异常记录的异常记录代码。
所述处理代码是指对所述Java源码文件进行统计处理的统计处理代码,例如耗时统计代码,参数记录代码,异常记录代码。所述处理代码存放在独立于所述Java源码文件的一个代码包中。
具体实施时,在获取到待编译的Java源码文件,以及对所述Java源码文件中的目标代码块进行统计处理的处理代码的基础上,通过下述步骤S104至步骤S108对所述Java源码以及所述处理代码进行编译处理。
步骤S104,扫描所述Java源码文件,获得针对所述目标代码块定义的注解。
所述注解为代码里的特殊标记,这些标记可以在编译、类加载或者运行时被读取,并执行相应的处理,通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。具体的,注解可以是对一个方法的注解,可以是对一个类的注解,也可以是对一个包的注解。
具体的,如果是对类定义了一个注解,相当于对所述类中的每个方法定义注解,如果是对一个包定义了一个注解,相当于对所述包中的每个方法定义注解。例如,实际应用中,对一个类定义了耗时统计注解,就是对所述类中每个方法定义了耗时统计注解,对一个包定义了异常记录注解,就是对所述包中每个方法定义了异常记录注解。通过这种注解定义的方式能够明显的降低统计处理中注解定义的次数,以此实现更为高效快捷的编程。
本实施例采用Maven编译对所述Java源码文件进行扫描,Maven是一个软件项目管理和编译工具,基于项目对象模型POM的概念,Maven可以从一个中心信息段管理项目的构建、报告和文档。Maven编译的过程中会自动扫描目录中的所有文件,看文件中有没有被定义的注解,并且确定所述注解所在的目标代码块。编译之后,所述Java源码从“.java”文件转换为“.class”文件,也就是Java类文件。其中,所述Java类文件,是指源码经过编译器产生的“.class”文件,这种文件具有具体格式,也就是Java源文件经过编译器编译后生成的二进制文件,每个合法的Java类文件都具备精确的定义,使得Java虚拟机得以正确读取和解释所有的Java文件。
所述Java类文件是8位字节的二进制流。数据项按顺序存储在Java类文件中,相邻的项之间没有间隔,这使得Java类文件变得紧凑,减少存储空间。主要有无符号数和表两类数据项,无符号数用来表述数字、索引、引用以及字符串等,比如u1、u2、u4、u8分别代表1个字节、2个字节、4个字节、8个字节的无符号数,而表是由多个无符号数以及其他的表组成的复合结构,习惯用_info结尾。表用于描述有层次关系的复合结构的数据,整个Java类文件本质上就是一张表。
Java类文件(“.class”)中,主要包括以下参数:
Magic:每个Java类文件的头4个字节称为魔数,它的值固定为0xCAFEBABE,表示文件类型是能够被JVM(Java Virtual Machine,Java虚拟机)处理的Java类文件;
Version:Java类文件的次版本号和主版本号;
Constant pool:该项存放了类中各种文字字符串、类名、方法名、接口名称、final变量以及对外部类的引用信息等常量;虚拟机必须为每一个被装载的类维护一个常量池,常量池中存储了相应类型所用到的所有类型、字段和方法的符号引用,因此它在Java的动态链接中起到了核心的作用。
Access flags:该项指明了该文件中定义的是类还是接口,一个Java类文件中只能有一个类或接口,同时还指名了类或接口的访问标志,如public,private,abstract等信息;
This class:指向表示该类全限定名称的字符串常量的指针;
Super class:指向表示父类全限定名称的字符串常量的指针;
Interfaces:一个指针数组,存放了该类或父类实现的所有接口名称的字符串常量的指针;
Fields:该项对类或接口中声明的字段进行了细致的描述。需要注意的是,Fields列表中仅列出了本类或接口中的字段,并不包括从超类和父接口继承而来的字段;
Methods:Methods项对类或接口中声明的方法进行了细致的描述。例如方法的名称、参数和返回值类型等。需要注意的是,Methods列表里仅存放了本类或本接口中的方法,并不包括从超类和父接口继承而来的方法。使用ASM(Assemble,汇编)进行AOP(AspectOriented Programming,面向切面编程)编程,通常是通过调整Method中的指令来实现的;
Class attributes:该项存放了在该文件中类或接口所定义的属性的基本信息。
步骤S106,将所述处理代码中与所述注解对应的处理代码转换为处理字节码。
所述处理字节码,是指与注解相对应的统计处理代码对应的统计处理字节码。
上述步骤S104确定所述注解的位置之后,在此,调用字节码转换器将所述注解对应的所述处理代码转换为所述处理字节码。本实施例采用字节码转换器将所述源字节码中定义的注解对应的处理代码转换为处理字节码,其中,字节码转换器能够将源码文件转换为Java类文件,例如,ASM中的Byte code outline插件。
所述Byte code Outline是Eclipse的插件,可以把当前的正在编辑的“.java”文件或者“.class”文件直接显示出其相应的字节码出来,而且可以对两个“.java”文件的字节码进行比较或者对两个“.class”文件的字节码进行比较或对一个“.java”文件与一个“.class”文件的字节码进行比较。
ASM是一个Java字节码操控框架,它可以用来修改现有的类,或者直接以二进制形式动态生成类,ASM还提供了一些常见的字节码转换和分析算法,可以根据这些算法构建定制的复杂转换和代码分析工具。ASM提供了与其他Java字节码框架类似的功能,但主要关注性能。因为它的设计和实现尽可能的小和快,所以它非常适合在动态系统中使用,当然它也可以以静态的方式使用,比如说它就可以被使用在编译器中。Java类文件被存储在具有严格格式定义的“.class”文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性、Java字节码以及Java指令。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
简而言之,通过编译器将Java源码文件编译成Java类文件,Java类文件中的内容虽然不同,但是它们都具有相同的格式,ASM通过使用访问者,也就是visitor模式,按照Java类文件特有的格式从头到尾扫描一遍Java类文件中的内容,在扫描的过程中,就可以对Java类文件做一些操作了,有点黑科技的感觉。
步骤S108,基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件。
所述Java源码文件经过编译得到所述源字节码,也就是Java类文件,获得所述源字节码以及源字节码中定义的注解所对应的处理字节码之后,调用字节码植入接口,如ASMAPI(Application Programming Interface),API是ASM的应用程序编程接口,将所述处理字节码植入到所述源字节码中注解所对应的方法中。
具体实施时,为方便编程,使植入后的包含源字节码和处理字节码的目标代码文件能够直接运行,本实施例提供的一种可选实施方式,采用API接口对源字节码文件进行重写,具体实现如下:
基于所述注解,调用字节码读取与分析引擎读取所述处理字节码和所述源字节码;
调用字节码的拼接引擎将所述读取与分析引擎读取到的字节码重写为所述目标代码文件。
本实施例提供的植入方法是Methods,Methods用于生成和转换已编译方法的ASMAPI基于Method Visitor的抽象类,该类由Class Visitor的Visit Method方法返回。首先调用Class Visitor接口,它是定义在Class字节码是会触发的事件,如类头解析完成、注解解析、字段解析、方法解析等。调用Class Reader类,字节码的读取与分析引擎,读取所述源字节码以及所述处理字节码,它采用类似SAX(Simple API for XML)的事件读取机制,每当有事件发生时,调用注册的Class Visitor、Annotation Visitor、Field Visitor、MethodVisitor做相应的处理。读取到我们需要的源字节码以及处理字节码后调用Class Writer类,一个字节码拼接引擎,将所述注解对应的处理字节码植入源字节码中与之对应的方法中。如果获得的是一个类文件,在植入的过程中,就要在所述类中包含的每个方法中,植入所述注解对应的所述处理字节码。拼接之后我们就获得了包括所述源字节码以及所述处理字节码的Java类文件,这个Java类文件会覆盖之前保存源字节码的Java类文件。
ASM提供了一个类Class Reader可以方便地让我们对.class文件进行读取与解析;ASM在Class Reader解析“.class”文件过程中,解析到某一个结构就会通知到ClassVisitor的相应方法,例如:解析到类方法时,就会回调Class Visitor,Visit Method方法。可以通过更改Class Visitor中相应结构方法返回值,实现对类的代码切入,例如:更改Class Visitor,Visit Method方法的默认返回值Method Visitor实例,通过操作该自定义Method Visitor从而实现对原方法的改写。其它的结构遍历也如同Class Visitor;通过Class Writer的to Byte Array()方法,得到Java类文件的字节码内容,最后通过文件流写入方式覆盖掉原先的内容,实现Java类文件的改写。
例如,在源字节码文件中,针对方法A定义了耗时统计的注解,在此,我们调用Class Reader类读取获得源字节码以及耗时统计代码经过Bytecode Outline插件转换成的字节码,再调用Class Writer类,将Class Reader类读取到的耗时统计字节码植入源字节码中耗时统计注解对应的方法中,重写为一个新的Java类文件,可以直接运行。
或者,在源字节码文件中,针对类C定义了参数记录的注解,在此,我们调用ClassReader类读取获得源字节码以及参数记录代码经过Bytecode Outline插件转换成的字节码,再调用Class Writer类,将Class Reader类读取到的参数记录字节码植入所述类的源字节码的每个方法中,重写为一个新的Java类文件,可以直接运行。
再或者,在源字节码文件中,针对包M定义了异常记录的注解,在此,我们调用Class Reader类读取获得源字节码以及异常记录代码经过Bytecode Outline插件转换成的字节码,再调用Class Writer类,将Class Reader类读取到的异常记录字节码植入所述包的源字节码的每个方法中,重写为一个新的Java类文件,可以直接运行。
除此之外,如果是对一个类定义注解,需要在所述类包含的每个方法中植入所述处理字节码,如果是对一个包定义注解,需要在所述包包含的每个方法中植入所述处理字节码。
如上所述,在对方法进行耗时统计的过程中,如果对类定义了一个耗时统计注解,相当于对所述类中的每个方法定义了所述耗时统计注解,相应的,在源字节码中植入耗时统计字节码的过程中,需要对所述类中每个方法所在的代码块植入所述耗时统计字节码;
如果对包定义了一个耗时统计注解,相当于对所述包中的每个方法定义了所述耗时统计注解,相应的,在源字节码中植入耗时统计字节码的过程中,需要对所述包中每个方法所在的代码块植入所述耗时统计字节码。
本实施例还提供一种slf4j(Simple Logging Facade For Java,简单日志门面)的日志框架来管理日志记录,将所述处理代码的运行结果写入预设存储目录,便于观察。所述slf4j是一种简洁的Java日志统一接口,顾名思义,就是一个使用Facade设计模式实现的面向Java Logging框架的接口开源包。其和Java数据库连接工具包JDBC(Java DatabaseConnectivity,Java数据库连接)很像,在JDBC框架中,各个不同数据库连接器分别针对不同数据库系统来实现对应的连接操作,而普通程序员只需要使用统一的JDBC接口而不需要关注具体底层使用的数据库类型,或者针对不同的数据库系统写各种兼容代码。同样,slf4j不参与具体的日志代码实现,它只是在代码编译的时候根据程序的配置来绑定具体的日志系统。这样,使用slf4j类库就可以让你的代码独立于任意一个特定的日志API。因此,如果编写一个对外开发的API或者一个同样的类库,那么为了不限制使用类库的代码必须使用指定的日志系统,应该使用slf4j。
基于每次对一个文件生成耗时方法都需要手动生成,且不好集成到第三方打包服务平台,于是结合Java开发者最常用的软件编译工具,编写了一个MAVEN插件,用于可配置化需要统计耗时的Java类在打包时自动生成统计耗时的方法。
这样Java开发者就可以在自己开发的项目中直接使用该MAVEN插件来进行自己需要统计耗时方法的管理。
下述以本实施例提供的一种Java编译场景的应用为例,对本实施例提供的编译处理方法进行进一步说明,参照图2,应用于Java编译场景的编译处理方法,具体包括步骤S202至步骤S210。
步骤S202,获取待编译的Java源码文件,以及对Java源码文件中的目标方法进行耗时统计处理的耗时统计代码。
以及,对Java源码文件进行编译处理,具体包括步骤S204至步骤S210。
步骤S204,对Java源码文件进行Maven编译,扫描编译得到的源字节码,获得针对目标方法定义的注解。
步骤S206,调用ASM中的Byte code outline插件将耗时统计代码转换为耗时统计字节码。
步骤S208,基于耗时统计注解,调用Class Reader类读取源字节码以及耗时统计字节码。
步骤S210,基于耗时统计注解,调用Class Writer类将读取到的源字节码以及耗时统计字节码重写在一起,覆盖保存源字节码的Java类文件。
综上所述,本实施例提供的采用ASM生成JAVA通用方法以及集成到MAVEN插件,使用自定义注解,应用ASM API实现通用逻辑代码的字节码生成,在需要实现的方法上加上该注解后,在项目进行Maven编译时扫描该注解修改编译后的字节码,节省了输入重复代码的时间,克服了重复代码导致的代码量大的问题,提高了代码的整洁程度,除此之外,还避免了一些性能消耗,结合Apache Maven插件,可以配置化实现通用方法的调用,实现了较为快捷的代码编程。
本说明书提供的一种编译处理装置实施例如下:
在上述的实施例中,提供了一种编译处理方法,与之相对应的,还提供了一种编译处理装置,下面结合附图进行说明。
参照图3,其示出了本实施例提供的一种编译处理装置的示意图。
由于装置实施例对应于方法实施例,所以描述得比较简单,相关的部分请参见上述提供的方法实施例的对应说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例提供一种编译处理装置,包括:
源码获取模块302,被配置为获取待编译的Java源码文件,以及对所述Java源码文件中的目标代码块进行统计处理的处理代码;
以及,通过运行如下模块对所述Java源码文件进行编译处理:
扫描模块304,被配置为扫描所述Java源码文件,获得针对所述目标代码块定义的注解;
转换模块306,被配置为将所述处理代码中与所述注解对应的目标处理代码转换为字节码;
植入模块308,被配置为基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述字节码,获得目标代码文件。
可选的,所述植入模块308,包括:
植入接口调用子模块,被配置为基于所述注解,调用字节码植入接口将所述处理字节码植入所述源字节码中;其中,所述字节码植入接口包括:ASM的应用程序编程接口。
可选的,所述植入模块308,包括:
字节码读取子模块,被配置为基于所述注解,调用字节码读取与分析引擎读取所述处理字节码和所述源字节码;
字节码拼接子模块,被配置为基于所述注解,调用字节码的拼接引擎将所述读取与分析引擎读取到的字节码重写为所述目标代码文件。
可选的,所述目标代码块包括下述至少一项:方法、类、包。
可选的,所述植入模块308,包括:
类植入子模块,被配置为针对所述类定义的注解,在所述类包含的每个方法植入所述注解对应的处理字节码;
包植入子模块,被配置为针对所述包定义的注解,在所述包包含的每个方法植入所述注解对应的处理字节码。
可选的,所述处理代码,包括下述至少一种:
执行耗时统计代码、执行参数记录代码和执行异常记录代码。
可选的,所述转换模块306,包括:
耗时转换子模块,被配置为将所述注解对应的执行耗时统计代码转换为耗时统计字节码。
可选的,所述植入模块308,包括:
耗时植入子模块,被配置为针对所述Java源码文件中定义的任意一个耗时统计注解,在该注解所对应的所述代码块中植入所述耗时统计字节码。
可选的,所述转换模块306,包括:
转换器调用子模块,被配置为调用字节码转换器将所述注解对应的所述处理代码转换为所述处理字节码;其中,所述字节码转换器包括:ASM中的Byte code outline插件。
可选的,所述编译处理装置,还包括:
写入子模块,被配置为采用日志框架将所述处理代码的运行结果写入预设存储目录。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
在20世纪30年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书实施例时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本说明书一个或多个实施例可提供为方法、系统或计算机程序产品。因此,本说明书一个或多个实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本说明书一个或多个实施例可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书的一个或多个实施例,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本文件的实施例而已,并不用于限制本文件。对于本领域技术人员来说,本文件可以有各种更改和变化。凡在本文件的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本文件的权利要求范围之内。
Claims (11)
1.一种编译处理方法,其特征在于,包括:
获取待编译的Java源码文件,以及对所述Java源码文件中的目标代码块进行统计处理的处理代码;
以及,对所述Java源码文件进行如下编译处理:
扫描所述Java源码文件,获得针对所述目标代码块定义的注解;
将所述处理代码中与所述注解对应的处理代码转换为处理字节码;
基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件。
2.根据权利要求1所述的编译处理方法,其特征在于,所述基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件,包括:
基于所述注解,调用字节码植入接口将所述处理字节码植入所述源字节码中;
其中,所述字节码植入接口包括:ASM的应用程序编程接口。
3.根据权利要求2所述的编译处理方法,其特征在于,所述基于所述注解,调用字节码植入接口将所述处理字节码植入所述源字节码中,包括:
基于所述注解,调用字节码读取与分析引擎读取所述处理字节码和所述源字节码;
调用字节码的拼接引擎将所述读取与分析引擎读取到的字节码重写为所述目标代码文件。
4.根据权利要求1所述的编译处理方法,其特征在于,所述目标代码块包括下述至少一项:
方法、类、包。
5.根据权利要求4所述的编译处理方法,其特征在于,所述基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件,包括:
针对所述类定义的注解,在所述类包含的每个方法植入所述注解对应的处理字节码;
或者,
针对所述包定义的注解,在所述包包含的每个方法植入所述注解对应的处理字节码。
6.根据权利要求1所述的编译处理方法,其特征在于,所述处理代码,包括下述至少一种:
执行耗时统计代码、执行参数记录代码和执行异常记录代码。
7.根据权利要求6所述的编译处理方法,其特征在于,所述将所述处理代码中与所述注解对应的处理代码转换为处理字节码,包括:
将所述注解对应的执行耗时统计代码转换为耗时统计字节码。
8.根据权利要求7所述的编译处理方法,其特征在于,所述基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述处理字节码,获得目标代码文件,包括:
针对所述Java源码文件中定义的任意一个耗时统计注解,在该注解所对应的所述代码块中植入所述耗时统计字节码。
9.根据权利要求1所述的编译处理方法,其特征在于,所述将所述注解对应的所述处理代码转换为处理字节码,包括:
调用字节码转换器将所述注解对应的所述处理代码转换为所述处理字节码;
其中,所述字节码转换器包括:ASM中的Byte code outline插件。
10.根据权利要求1所述的编译处理方法,其特征在于,还包括:
采用日志框架将所述处理代码的运行结果写入预设存储目录。
11.一种编译处理装置,其特征在于,包括:
源码获取模块,被配置为获取待编译的Java源码文件,以及对所述Java源码文件中的目标代码块进行统计处理的处理代码;
以及,通过运行如下模块对所述Java源码文件进行编译处理:
扫描模块,被配置为扫描所述Java源码文件,获得针对所述目标代码块定义的注解;
转换模块,被配置为将所述处理代码中与所述注解对应的处理代码转换为字节码;
植入模块,被配置为基于所述注解,在所述Java源码文件编译获得的源字节码中植入所述字节码,获得目标代码文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010814991.2A CN112114810A (zh) | 2020-08-13 | 2020-08-13 | 编译处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010814991.2A CN112114810A (zh) | 2020-08-13 | 2020-08-13 | 编译处理方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112114810A true CN112114810A (zh) | 2020-12-22 |
Family
ID=73804086
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010814991.2A Pending CN112114810A (zh) | 2020-08-13 | 2020-08-13 | 编译处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112114810A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112965940A (zh) * | 2021-03-04 | 2021-06-15 | 中国邮政储蓄银行股份有限公司 | 项目文件的展示方法及展示装置、电子设备、处理器 |
CN113553040A (zh) * | 2021-07-20 | 2021-10-26 | 中国第一汽车股份有限公司 | 可见即可说识别功能的注册实现方法、装置、设备及介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100115502A1 (en) * | 2008-11-06 | 2010-05-06 | Jiva Azeem S | Post Processing of Dynamically Generated Code |
CN102360328A (zh) * | 2011-09-29 | 2012-02-22 | 用友软件股份有限公司 | 程序监控装置和程序监控方法 |
CN107577456A (zh) * | 2017-08-28 | 2018-01-12 | 北京奇虎科技有限公司 | 一种插件应用的处理方法及装置 |
CN108628635A (zh) * | 2018-05-07 | 2018-10-09 | 广州视源电子科技股份有限公司 | 获取参数名和局部变量名的方法、装置、设备及存储介质 |
CN110134400A (zh) * | 2019-04-02 | 2019-08-16 | 北京奇艺世纪科技有限公司 | 数据获取方法、装置、电子设备及计算机可读存储介质 |
CN110609703A (zh) * | 2019-09-18 | 2019-12-24 | 腾讯科技(深圳)有限公司 | 性能检测工具实现方法、装置、可读存储介质及终端设备 |
CN110716715A (zh) * | 2019-10-18 | 2020-01-21 | 恒生电子股份有限公司 | 一种应用程序开发方法、装置、设备及介质 |
-
2020
- 2020-08-13 CN CN202010814991.2A patent/CN112114810A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100115502A1 (en) * | 2008-11-06 | 2010-05-06 | Jiva Azeem S | Post Processing of Dynamically Generated Code |
CN102360328A (zh) * | 2011-09-29 | 2012-02-22 | 用友软件股份有限公司 | 程序监控装置和程序监控方法 |
CN107577456A (zh) * | 2017-08-28 | 2018-01-12 | 北京奇虎科技有限公司 | 一种插件应用的处理方法及装置 |
CN108628635A (zh) * | 2018-05-07 | 2018-10-09 | 广州视源电子科技股份有限公司 | 获取参数名和局部变量名的方法、装置、设备及存储介质 |
CN110134400A (zh) * | 2019-04-02 | 2019-08-16 | 北京奇艺世纪科技有限公司 | 数据获取方法、装置、电子设备及计算机可读存储介质 |
CN110609703A (zh) * | 2019-09-18 | 2019-12-24 | 腾讯科技(深圳)有限公司 | 性能检测工具实现方法、装置、可读存储介质及终端设备 |
CN110716715A (zh) * | 2019-10-18 | 2020-01-21 | 恒生电子股份有限公司 | 一种应用程序开发方法、装置、设备及介质 |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112965940A (zh) * | 2021-03-04 | 2021-06-15 | 中国邮政储蓄银行股份有限公司 | 项目文件的展示方法及展示装置、电子设备、处理器 |
CN112965940B (zh) * | 2021-03-04 | 2024-05-28 | 中国邮政储蓄银行股份有限公司 | 项目文件的展示方法及展示装置、电子设备、处理器 |
CN113553040A (zh) * | 2021-07-20 | 2021-10-26 | 中国第一汽车股份有限公司 | 可见即可说识别功能的注册实现方法、装置、设备及介质 |
CN113553040B (zh) * | 2021-07-20 | 2022-12-02 | 中国第一汽车股份有限公司 | 可见即可说识别功能的注册实现方法、装置、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7047524B1 (en) | Object oriented ADN and method of converting a non-object oriented computer language to an object oriented computer language | |
KR101795844B1 (ko) | 런타임 시스템 | |
US7174533B2 (en) | Method, system, and program for translating a class schema in a source language to a target language | |
TWI536263B (zh) | 將作業系統之原始應用程式介面投射至其它程式語言 | |
US8869100B1 (en) | Data objects for model-based design | |
KR100942322B1 (ko) | 마크업 내부에서 명시적으로 서브클래스를 정의하고 이용하는 시스템 및 방법 | |
CN110007920B (zh) | 一种获取代码依赖关系的方法、装置及电子设备 | |
KR101213890B1 (ko) | 강한 데이터 유형을 이용하여 소프트웨어 프로그램에서음성 인식 문법을 나타내기 위한 방법 | |
KR101597599B1 (ko) | 소스 위치가 결여된 코드 세그먼트들을 가지는 소스 코드를 모델링하기 위한 방법 | |
WO2024045379A1 (zh) | 编译方法和编译器、Wasm虚拟机 | |
CN112114810A (zh) | 编译处理方法及装置 | |
CN114138748A (zh) | 数据库映射文件生成方法、装置、设备及存储介质 | |
CN113138755A (zh) | 一种json序列化和反序列化的优化方法及系统 | |
Dijkstra et al. | Building javascript applications with haskell | |
US9697021B2 (en) | Modifiable high-level intermediate representation of source code | |
CN116521144A (zh) | 一种程序封装方法、装置及电子设备 | |
Lions et al. | Extending opentool/uml using metamodeling: An aspect oriented programming case study | |
Neumann et al. | An overview of the next scripting toolkit | |
Kara | Design and implementation of the modelicaml code generator using acceleo 3. x | |
CN117311799B (zh) | 一种软件项目页面的配置方法 | |
Maschotta et al. | An OCL Implementation for Model-Driven Engineering of C++ | |
CN117149155A (zh) | 服务接口的代码校验方法、装置、设备及存储介质 | |
CN117369861A (zh) | 应用程序的线程管理策略配置方法及相关装置 | |
CN118245154A (zh) | 界面渲染方法、装置、电子设备及存储介质 | |
Padovani et al. | A generative approach to the implementation of language bindings for the document object model |
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 |