CN112000362A - 统计Java源文件代码行数的方法及系统 - Google Patents
统计Java源文件代码行数的方法及系统 Download PDFInfo
- Publication number
- CN112000362A CN112000362A CN202011177822.9A CN202011177822A CN112000362A CN 112000362 A CN112000362 A CN 112000362A CN 202011177822 A CN202011177822 A CN 202011177822A CN 112000362 A CN112000362 A CN 112000362A
- Authority
- CN
- China
- Prior art keywords
- class file
- file
- code
- counting
- target 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Devices For Executing Special Programs (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开一种统计Java源文件代码行数的方法及系统,包括如下步骤:(1)当Java虚拟机开始加载类文件,实时获取已被加载的类文件数组;(2)根据目标类文件的特征参数判断已获取到的所述类文件数组中是否包含有所述目标类文件,若是,则进入步骤(3),若否,则返回步骤(1),其中所述目标类文件是需要统计代码行数的源文件编译后的类文件,所述目标类文件的特征参数被预先添加在Java虚拟机;(3)获取所述目标类文件中所有实例方法和静态方法的字节码信息,并从所述字节码信息中得到对应的行号字段值并比较出最大行号值,进而得到需要统计代码行数的源文件的代码行数。本发明还公开了一种统计Java源文件代码行数的装置及可读存储介质。
Description
技术领域
本发明涉及计算机技术领域,具体涉及一种统计Java源文件代码行数的方法及系统。
背景技术
目前,统计Java代码行数的技术主要是通过文件流一行行读取Java源代码文件,使用这种方法会误将多行或单行的代码注释及一些无效的代码所在行当作代码行数进行统计,这样统计的代码行数不准确。同时,在遇到一些比较大的Java源文件时,使用文件流一行行读取文件内容来计算,会一定程度影响统计效率,并且读取的文件内容需要临时存储在内存中,导致了内存资源被额外消耗。此外,Java源文件具有一定的可变性,这种特性容易导致在统计代码行数时出现前后结果不一致的情况,容易给使用者带来一定的误导。
发明内容
本发明的目的在于提供一种统计Java源文件代码行数的方法、系统、装置及可读存储介质,有利于提高Java源文件代码行数统计准确性和统计效率,同时不会额外损耗内存资源去存储临时内容。
为实现上述目的,本发明提供了一种统计Java源文件代码行数的方法,包括如下步骤:
(1)当Java虚拟机开始加载类文件,实时获取已被加载的类文件数组;
(2)根据目标类文件的特征参数判断已获取到的所述类文件数组中是否包含有所述目标类文件,若是,则进入步骤(3),若否,则返回步骤(1),其中所述目标类文件是需要统计代码行数的源文件编译后的类文件,所述目标类文件的特征参数被预先添加在Java虚拟机;
(3)获取所述目标类文件中所有实例方法和静态方法的字节码信息,并从所述字节码信息中得到对应的行号字段值并比较出最大行号值。
较佳地,在步骤(1)之前,还包括安装“统计代码行数”程序包的步骤。
较佳地,步骤(1)中,所述“实时获取已被加载的类文件数组”通过Java Agent技术执行。
较佳地,所述步骤(2)包括如下步骤:
启用异步线程开启对所述类文件数组的分析;
获取预先添加的所述目标类文件的特征参数;
遍历已加载的所述类文件数组;
根据所述目标类文件的特征参数判断所述类文件数组中是否包含有所述目标类文件,若是,则进入步骤(3),若否,则返回步骤(1)。
较佳地,所述特征参数为需要统计代码行数的所述源文件和所述目标类文件的名称。
较佳地,所述“根据所述目标类文件的特征参数判断所述类文件数组中是否包含有所述目标类文件,若是,则进入步骤(3),若否,则返回步骤(1)”具体为:
判断所述类文件数组中是否存在所述目标类文件的名称,若是,则根据所述目标类文件的名称从所述类文件数组中筛选出所述目标类文件并进入步骤(3),若否,则返回步骤(1)。
较佳地,步骤(3)中,通过ASM字节码操纵框架获取所述目标类文件中所有实例方法和静态方法的字节码信息。
为实现上述目的,本发明还提供了一种统计Java源文件代码行数的系统,包括:
类文件收集模块,用于当Java虚拟机开始加载类文件,实时获取已被加载的类文件数组;
分析模块,用于根据目标类文件的特征参数判断已获取到的所述类文件数组中是否包含有所述目标类文件,若是,则进入统计模块,若否,则返回类文件收集模块,其中所述目标类文件是需要统计代码行数的源文件编译后的类文件,所述目标类文件的特征参数被预先添加在Java虚拟机;
统计模块,用于获取所述目标类文件中所有实例方法和静态方法的字节码信息,并从所述字节码信息中得到对应的行号字段值并比较出最大行号值。
为实现上述目的,本发明还提供了一种统计Java源文件代码行数的装置,包括:
处理器;
存储器,其中存储有所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1至7任一项所述的统计Java源文件代码行数的方法。
为实现上述目的,本发明还提供了一种可读存储介质,其上存储有程序,所述程序被处理器执行时实现如上所述的统计Java源文件代码行数的方法。
与现有技术相比,本发明通过直接对Java类文件进行数据分析,有效提高了统计的准确性。而且,由于本发明是在程序运行时动态分析类文件信息,而不是一行行读取文件内容,无论类文件内容有多大都不会影响程序本身的速度。另外,因为每一个Java类文件均包含自身的类文件信息,并不需要额外地消耗内存去存储临时内容,所以减少了资源损耗。
附图说明
图1是本发明实施例统计Java源文件代码行数的方法的流程图。
图2是本发明实施例统计Java源文件代码行数的系统的示意框图。
图3是本发明实施例类文件收集模块的执行流程图。
图4是本发明实施例分析模块的执行流程图。
图5是本发明实施例统计模块的执行流程图。
图6是本发明实施例统计Java源文件代码行数的装置的示意框图。
具体实施方式
为了详细说明本发明的技术内容、构造特征、所实现目的及效果,以下结合实施方式并配合附图详予说明。
Java源文件就是程序员们所编写出来的文件,程序员们能看懂的文件,后缀为.java。Java类文件是利用java虚拟机生成的编译文件,用来给机器看的机器语言,扩展名为.class。Java类文件也就是class文件是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件,也被称为字节码文件。
两者的联系是Java源文件经过编译之后就会生成对应的Java类文件。而且一旦Java源文件编译之后生成了Java类文件,那么相对应的Java类文件通常情况下是不能被手动修改的,即不能进行添加代码或者删除代码操作,但是Java源文件则可以任意添加代码或者删除代码。所以基于此,可以通过统计Java类文件(.class)的代码行数来实现统计Java源文件代码行数,进而避免直接统计Java源文件代码行数所带来的技术问题。
实施例一。
请参阅图1,本发明公开了一种统计Java源文件代码行数的方法,包括如下步骤:
S101、当Java虚拟机开始加载类文件,实时获取已被加载的类文件数组。
具体地,“实时获取已被加载的类文件数组”是通过Java Agent技术执行。
具体地,如果类文件数组不为空,则开始进入步骤S102,反之,继续等待类文件被加载来收集类文件数组。
S102、根据目标类文件的特征参数判断已获取到的类文件数组中是否包含有目标类文件,若是,则进入步骤S103,若否,则返回步骤S101,其中目标类文件是需要统计代码行数的源文件编译后的类文件,目标类文件的特征参数被预先添加在Java虚拟机。
具体地,步骤S102包括如下步骤:
启用异步线程开启对类文件数组的分析;
获取预先添加的目标类文件的特征参数;
遍历已加载的类文件数组;
根据目标类文件的特征参数判断类文件数组中是否包含有目标类文件,若是,则进入步骤S103,若否,则返回步骤S101。
具体地,特征参数为需要统计代码行数的源文件和目标类文件的名称。由于源文件与目标类文件的命名通常一致,因此可以直接使用需要统计代码行数的源文件的名称来作为特征参数。
具体地,“根据目标类文件的特征参数判断类文件数组中是否包含有目标类文件,若是,则进入步骤S103,若否,则返回步骤S101”具体为:
判断类文件数组中是否存在目标类文件的名称,若是,则根据目标类文件的名称从类文件数组中筛选出目标类文件并进入步骤S103,若否,则返回步骤S101。
S103、获取目标类文件中所有实例方法和静态方法的字节码信息,并从字节码信息中得到对应的行号字段值(lineNumber)并比较出最大行号值。这里得到的最大行号值即是需要统计代码行数的源文件的代码行数。
具体地,步骤S103中,通过ASM字节码操纵框架获取目标类文件中所有实例方法和静态方法的字节码信息,相较一行行读取文件内容,效率会明显提高。
本发明的统计Java源文件代码行数的方法通过直接对Java类文件进行数据分析,有效提高了统计的准确性。而且,由于本发明统计Java源文件代码行数的方法是在程序运行时动态分析类文件信息,而不是一行行读取文件内容,无论类文件内容有多大都不会影响程序本身的速度。另外,因为每一个Java类文件均包含自身的类文件信息,并不需要额外地消耗内存去存储临时内容,所以减少了资源损耗。
具体地,在步骤S101之前,还包括安装“统计代码行数”程序包的步骤。
具体地,在步骤S101之前,需要在JVM参数中添加目标类文件的特征参数(具体为需要统计代码行数的源文件和目标类文件的名称)。比如,在一检测示例中,需要统计代码行数的源文件(目标源文件)为Test.java,需要事先安装的“统计代码行数”程序包为countLineNumber.jar,在步骤S101之可以在JVM参数中添加-javaagent:countLineNumber.jar=targetClass=Test。后续判断时,即根据类文件数组中是否存在Test.class进行是否存在目标类文件的判断。
具体地,在执行本发明统计Java源文件代码行数的方法之前,首先需要通过Java编译器把源文件的指令翻译成类文件(字节码)。
实施例二。
请参阅图2,本发明公开了一种统计Java源文件代码行数的系统,包括:
类文件收集模块100,用于当Java虚拟机开始加载类文件,实时获取已被加载的类文件数组;
分析模块200,用于根据目标类文件的特征参数判断已获取到的类文件数组中是否包含有目标类文件,若是,则进入统计模块300,若否,则返回类文件收集模块100,其中目标类文件是需要统计代码行数的源文件编译后的类文件,目标类文件的特征参数被预先添加在Java虚拟机;
统计模块300,用于获取目标类文件中所有实例方法和静态方法的字节码信息,并从字节码信息中得到对应的行号字段值并比较出最大行号值(即需要统计代码行数的源文件的代码行数)。
请参阅图3,具体地,类文件收集模块100被配置为执行:
当Java虚拟机开始加载Java类文件,调用Instrument实例方法得到所有被加载的类文件(getAllLoadedClasses),以获取被加载的类文件数组(classArray);
如果类文件数组不为空,则开始进入分析模块200,反之,继续等待类文件被加载来收集类文件数组。
请参阅图4,具体地,分析模块200被配置为执行:
启用异步线程以开启对类文件数组的分析;
获取预先添加的目标类文件的名称(特征参数);
遍历已加载的类文件数组;
判断类文件数组中是否存在目标类文件的名称,若是,则根据目标类文件的名称从类文件数组中筛选出目标类文件并进入统计模块300,若否,则返回类文件收集模块100(等待目标类文件被加载)。
请参阅图5,具体地,统计模块300被配置为依次执行:
获取目标类文件对象;
使用ASM字节码操纵框架读取目标类文件中所有实例方法和静态方法的字节码信息;
从所有方法的字节码信息中获取对应的行号字段值;
从所有方法的行号字段值中,比较出最大行号值。
实施例三。
请参阅图6,本发明还公开了一种统计Java源文件代码行数的装置,包括:
处理器40;
存储器50,其中存储有处理器40的可执行指令;
其中,处理器40配置为经由执行可执行指令来执行如实施例一所述的统计Java源文件代码行数的方法。
实施例四。
本发明还公开了一种可读存储介质,其上存储有程序,程序被处理器执行时实现如实施例一所述的统计Java源文件代码行数的方法。
综上,本发明通过直接对Java类文件进行数据分析,有效提高了统计的准确性。而且,由于本发明是在程序运行时动态分析类文件信息,而不是一行行读取文件内容,无论类文件内容有多大都不会影响程序本身的速度。另外,因为每一个Java类文件均包含自身的类文件信息,并不需要额外地消耗内存去存储临时内容,所以减少了资源损耗。
以上所揭露的仅为本发明的较佳实例而已,不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,均属于本发明所涵盖的范围。
Claims (10)
1.一种统计Java源文件代码行数的方法,其特征在于,包括如下步骤:
(1)当Java虚拟机开始加载类文件,实时获取已被加载的类文件数组;
(2)根据目标类文件的特征参数判断已获取到的所述类文件数组中是否包含有所述目标类文件,若是,则进入步骤(3),若否,则返回步骤(1),其中所述目标类文件是需要统计代码行数的源文件编译后的类文件,所述目标类文件的特征参数被预先添加在Java虚拟机;
(3)获取所述目标类文件中所有实例方法和静态方法的字节码信息,并从所述字节码信息中得到对应的行号字段值并比较出最大行号值。
2.如权利要求1所述的统计Java源文件代码行数的方法,其特征在于,
在步骤(1)之前,还包括安装“统计代码行数”程序包的步骤。
3.如权利要求1所述的统计Java源文件代码行数的方法,其特征在于,步骤(1)中,所述“实时获取已被加载的类文件数组”通过Java Agent技术执行。
4.如权利要求1所述的统计Java源文件代码行数的方法,其特征在于,所述步骤(2)包括如下步骤:
启用异步线程开启对所述类文件数组的分析;
获取预先添加的所述目标类文件的特征参数;
遍历已加载的所述类文件数组;
根据所述目标类文件的特征参数判断所述类文件数组中是否包含有所述目标类文件,若是,则进入步骤(3),若否,则返回步骤(1)。
5.如权利要求4所述的统计Java源文件代码行数的方法,其特征在于,所述特征参数为需要统计代码行数的所述源文件和所述目标类文件的名称。
6.如权利要求5所述的统计Java源文件代码行数的方法,其特征在于,所述“根据所述目标类文件的特征参数判断所述类文件数组中是否包含有所述目标类文件,若是,则进入步骤(3),若否,则返回步骤(1)”具体为:
判断所述类文件数组中是否存在所述目标类文件的名称,若是,则根据所述目标类文件的名称从所述类文件数组中筛选出所述目标类文件并进入步骤(3),若否,则返回步骤(1)。
7.如权利要求1所述的统计Java源文件代码行数的方法,其特征在于,步骤(3)中,通过ASM字节码操纵框架获取所述目标类文件中所有实例方法和静态方法的字节码信息。
8.一种统计Java源文件代码行数的系统,其特征在于,包括:
类文件收集模块,用于当Java虚拟机开始加载类文件,实时获取已被加载的类文件数组;
分析模块,用于根据目标类文件的特征参数判断已获取到的所述类文件数组中是否包含有所述目标类文件,若是,则进入统计模块,若否,则返回类文件收集模块,其中所述目标类文件是需要统计代码行数的源文件编译后的类文件,所述目标类文件的特征参数被预先添加在Java虚拟机;
统计模块,用于获取所述目标类文件中所有实例方法和静态方法的字节码信息,并从所述字节码信息中得到对应的行号字段值并比较出最大行号值。
9.一种统计Java源文件代码行数的装置,其特征在于,包括:
处理器;
存储器,其中存储有所述处理器的可执行指令;
其中,所述处理器配置为经由执行所述可执行指令来执行权利要求1至7任一项所述的统计Java源文件代码行数的方法。
10.一种可读存储介质,其上存储有程序,其特征在于,所述程序被处理器执行时实现如权利要求1-7任一项所述的统计Java源文件代码行数的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011177822.9A CN112000362A (zh) | 2020-10-29 | 2020-10-29 | 统计Java源文件代码行数的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011177822.9A CN112000362A (zh) | 2020-10-29 | 2020-10-29 | 统计Java源文件代码行数的方法及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112000362A true CN112000362A (zh) | 2020-11-27 |
Family
ID=73475770
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011177822.9A Pending CN112000362A (zh) | 2020-10-29 | 2020-10-29 | 统计Java源文件代码行数的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112000362A (zh) |
-
2020
- 2020-10-29 CN CN202011177822.9A patent/CN112000362A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108628751B (zh) | 一种无用依赖项检测方法及装置 | |
US20090248721A1 (en) | System And Method for Stack Crawl Testing and Caching | |
KR101493076B1 (ko) | 버퍼 오버플로우 관리를 통한 바이러스 코드 실행방지장치 및 그 방법 | |
US6675379B1 (en) | Automatic removal of array memory leaks | |
JP5705084B2 (ja) | 2パス自動アプリケーション計測 | |
US8522216B2 (en) | Memory leak detection | |
CN108491207B (zh) | 表达式处理方法、装置、设备及计算机可读存储介质 | |
CN107015904B (zh) | 堆栈的保护方法及装置 | |
US7765375B2 (en) | Memory management method, information processing apparatus, and memory management program | |
CN115269444B (zh) | 代码静态检测方法、装置及服务器 | |
US20240036841A1 (en) | Method and Apparatus for Compatibility Detection, Device and Non-transitory computer-readable storage medium | |
JP3813019B2 (ja) | プログラム処理方法、指定メソッドに関連するフレームを検出する方法、及び記憶媒体 | |
JP3437932B2 (ja) | 配列レンジ・チェックのためのコード生成方法及び装置、並びにバージョニング方法及び装置 | |
CN112948828A (zh) | 一种二进制程序恶意代码检测方法、终端设备及存储介质 | |
CN112000362A (zh) | 统计Java源文件代码行数的方法及系统 | |
US8756580B2 (en) | Instance-based field affinity optimization | |
CN112084108A (zh) | 一种测试脚本生成方法、装置及相关组件 | |
CN116450398A (zh) | 异常回溯方法、装置、设备和介质 | |
JP6075204B2 (ja) | 性能情報収集プログラム、情報処理装置及び性能情報収集方法 | |
CN113392032B (zh) | 一种api发现的方法、确定测试覆盖率的方法及装置 | |
US8930420B2 (en) | Orphan object tracking for objects having acquire-release semantics | |
WO2021104027A1 (zh) | 代码性能检测方法、装置、设备及存储介质 | |
CN112416727A (zh) | 批处理作业的检核方法、装置、设备及介质 | |
EP3995966A1 (en) | System and method for automatic application log messages grouping using logging framework code instrumentation | |
CN113296834B (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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20201127 |