【Python】用于遍历java文件,将其中用到的注解Annotation都统计出来的Python程序

自从用上了SpringBoot,文件里是一堆注解,有的熟悉,有的生疏,如果有天需要整理一遍的话,编个程序把所有用到的注解都统计出来是个好主意。这个任务正适合用python完成,下面就是程序:

复制代码
#encoding=utf-8

import os,fnmatch,re

class Caculator:
    def __init__(self,javaProjectFolder):
        self.folder=javaProjectFolder

    def tranversal(self):
        print('进入目录:'+self.folder)
        self.matches=[]

        for root,subdirs,files in os.walk(self.folder):
            for filename in fnmatch.filter(files,'*.java'):
                self.matches.append(os.path.join(root,filename))

    def printJavaFiles(self):
        print('\n共找到'+str(len(self.matches))+'个java文件如下:')
        for i,javafile in enumerate(self.matches):
            print(str(i+1)+'.'+javafile)

    def findAnnotations(self):
        self.map={}

        pattern="\s*[@]([A-Z]{1}[a-zA-Z]+)\s*"
        for i,javafile in enumerate(self.matches):
            with open(javafile,'r',encoding='utf-8') as infile:
                for line in infile:
                    list=re.findall(pattern,line)
                    if len(list)>0:
                        for i,anno in enumerate(list):
                            #print(anno)
                            if anno in self.map:
                                self.map[anno]=self.map[anno]+1
                            else:
                                self.map[anno]=1

    def printAnnoAsAbcOrder(self):
        print('\n>以字典序打印(含出现次数)注解如下:')
        list=sorted(self.map.items(),key=lambda x:x[0])
        for item in list:
            print(item)

    def printAnnoAsCountOrder(self):
        print('\n>以出现次数打印注解如下:')
        list=sorted(self.map.items(),key=lambda x:x[1])
        for item in list:
            print(item)

    def printAnnotations(self):
        print('\n>以字典序打印注解如下:')
        list=[]
        for key in self.map.keys():
            list.append(key)

        list=sorted(list)
        for item in list:
            print(item)

cclt = Caculator('C:\hy\prog\myBank')
cclt.tranversal()
cclt.printJavaFiles()
cclt.findAnnotations()
cclt.printAnnoAsAbcOrder()
cclt.printAnnoAsCountOrder()
cclt.printAnnotations()
复制代码

运行效果:

复制代码
C:\hy\py>python annotationsInJava.py
进入目录:C:\hy\prog\myBank

共找到15个java文件如下:
1.C:\hy\prog\myBank\.mvn\wrapper\MavenWrapperDownloader.java
2.C:\hy\prog\myBank\src\main\java\com\hy\mybank\MyBankApplication.java
3.C:\hy\prog\myBank\src\main\java\com\hy\mybank\RedisConfig.java
4.C:\hy\prog\myBank\src\main\java\com\hy\mybank\ctrl\ActionController.java
5.C:\hy\prog\myBank\src\main\java\com\hy\mybank\ctrl\JsonController.java
6.C:\hy\prog\myBank\src\main\java\com\hy\mybank\Entity\Student.java
7.C:\hy\prog\myBank\src\main\java\com\hy\mybank\mapper\AccountMapper.java
8.C:\hy\prog\myBank\src\main\java\com\hy\mybank\mapper\AccountSql.java
9.C:\hy\prog\myBank\src\main\java\com\hy\mybank\mapper\StudentMapper.java
10.C:\hy\prog\myBank\src\main\java\com\hy\mybank\mapper\StudentSql.java
11.C:\hy\prog\myBank\src\main\java\com\hy\mybank\mapper\TransferException.java
12.C:\hy\prog\myBank\src\main\java\com\hy\mybank\mq\RabbitMqMsgReceiver.java
13.C:\hy\prog\myBank\src\main\java\com\hy\mybank\mq\RabbitMqMsgSender.java
14.C:\hy\prog\myBank\src\main\java\com\hy\mybank\service\AccountService.java
15.C:\hy\prog\myBank\src\test\java\com\hy\mybank\MyBankApplicationTests.java

>以字典序打印(含出现次数)注解如下:
('Autowired', 8)
('Bean', 4)
('Component', 3)
('Configuration', 1)
('Controller', 1)
('EnableCaching', 1)
('GetMapping', 3)
('Insert', 1)
('Mapper', 2)
('ModelAttribute', 2)
('Override', 2)
('Param', 4)
('RabbitHandler', 1)
('RabbitListener', 1)
('RequestMapping', 7)
('Resource', 3)
('RestController', 1)
('Select', 4)
('SelectProvider', 2)
('SpringBootApplication', 1)
('SpringBootTest', 1)
('Test', 1)
('Transactional', 1)
('Update', 1)
('Value', 8)

>以出现次数打印注解如下:
('SpringBootApplication', 1)
('Configuration', 1)
('EnableCaching', 1)
('Controller', 1)
('RestController', 1)
('Update', 1)
('Insert', 1)
('RabbitListener', 1)
('RabbitHandler', 1)
('Transactional', 1)
('SpringBootTest', 1)
('Test', 1)
('Override', 2)
('ModelAttribute', 2)
('Mapper', 2)
('SelectProvider', 2)
('GetMapping', 3)
('Component', 3)
('Resource', 3)
('Bean', 4)
('Select', 4)
('Param', 4)
('RequestMapping', 7)
('Value', 8)
('Autowired', 8)

>以字典序打印注解如下:
Autowired
Bean
Component
Configuration
Controller
EnableCaching
GetMapping
Insert
Mapper
ModelAttribute
Override
Param
RabbitHandler
RabbitListener
RequestMapping
Resource
RestController
Select
SelectProvider
SpringBootApplication
SpringBootTest
Test
Transactional
Update
Value
复制代码

-END-

 

posted @   逆火狂飙  阅读(211)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2019-09-26 最简SpringBoot程序制法
2017-09-26 【Canvas】逐像素在canvas中显示一张图片
2017-09-26 【Canvas与图标】蓝色数据库图标
2017-09-26 【Canvas与诗词】什么力也瞬灭不了火炭般的眼睛...
2017-09-26 【Canvas与图标】正方形牛皮纸文件袋图标
2017-09-26 【Canvas与图标】蓝色三角函数图标(120*120)
2017-09-26 【Canvas与技法】绘制简化“美元”标志
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示