python脚本寻找Java文件方法

2023-10-31

统计 Java 文件中方法行数

最近接到一个需求,有一个安全扫描,可以扫描到是那个Java文件有问题,但是不知道是该文件下哪个方法有问题,所以想根据行号找到对应方法进行统计。本文将介绍如何使用 Python javalang 库实现这个功能。

步骤

1.准备工作

首先,我们需要安装 Java Parser 库和 javalang 库。可以通过以下命令来安装:

pip install javalang
pip install javaparser

2.解析 Java 文件

使用 javalang 库中的 parse 函数解析 Java 文件,生成 AST 语法树。代码如下:

from javalang import parse

file_path = "RequestHandler.java"

with open(file_path, "r", encoding="utf-8") as f:
    file_content = f.read()

tree = parse.parse(file_content)

3.查找方法节点

使用 Java Parser 库遍历语法树,查找所有包含方法体的方法节点。代码如下:

from javalang.tree import MethodDeclaration
from javaparser import parse

methods = []

with open(file_path, "r", encoding="utf-8") as f:
    file_content = f.read()

cu = parse(file_content)

for node in cu.findAll(MethodDeclaration):
    if node.body is not None:
        methods.append(node)

4.计算方法行数

对于每个方法节点,计算其方法体的起始行号和终止行号,将其保存到一个列表中。代码如下:

list = []

for method in methods:
    if not method.body:
        continue

    method_body = method.body[0]
    start_line_number = method_body.position.line - 1
    end_line_number = method_body.position.end.line - 1
    list.append({'index': start_line_number, 'name': method.name})

5.查找最后一个起始行号小于等于给定值的方法

按照方法体的起始行号排序,查找最后一个起始行号小于等于给定值的方法。代码如下:

limit = 44

for index, value in reversed(list(enumerate(list))):
    if value["index"] <= limit:
        if index > 0:
            print(list[index - 1]["name"])
        print(f"{index}: {value}")
        break

至此,我们已经实现了统计 Java 文件中各个方法的行数,并找到最后一个起始行号小于等于给定值的方法的功能。

完整代码

from javalang import parse
from javalang.tree import MethodDeclaration
from javaparser import parse as jp_parse


# 解析 Java 文件,生成 AST 语法树
file_path = "RequestHandler.java"
with open(file_path, "r", encoding="utf-8") as f:
    file_content = f.read()
tree = parse.parse(file_content)

# 查找所有包含方法体的方法节点
methods = []
for path, node in tree.filter(MethodDeclaration):
    if isinstance(node, MethodDeclaration):
        if not node.body:
            continue
        methods.append(node)

# 计算每个方法体的起始行号和终止行号
list = []
for method in methods:
    if not method.body:
        continue
    method_body = method.body[0]
    start_line_number = method_body.position.line - 1
    end_line_number = method_body.position.end.line - 1
    list.append({'index': start_line_number, 'name': method.name})

# 查找最后一个起始行号小于等于给定值的方法
limit = 44
for index, value in reversed(list(enumerate(list))):
    if value["index"] <= limit:
        if index > 0:
            print(list[index - 1]["name"])
        print(f"{index}: {value}")
        break

运行结果
在这里插入图片描述

附录:Java代码


package com.atyang.mybatisplus.t1;

import com.atyang.mybatisplus.strategy.t1.Request;

/**  * 定义请求处理器抽象类  * @author   */ public abstract class RequestHandler {

    /**
     * 下一个处理器
     */
    private RequestHandler successor;

    /**
     * 构造函数
     * @param successor 下一个处理器
     */
    public RequestHandler(RequestHandler successor) {
        this.successor = successor;
    }

    public void handleRequest(Request request) {
        if (canHandle(request)) {
            processRequest(request);
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }

    /**
     * 处理请求
     * @param request 请求
     */
    protected abstract void processRequest(Request request);

    /**
     * 判断是否能处理请求
     * @param request 请求
     * @return 是否能处理请求
     */
    private boolean canHandle(Request request) {
        int a = 10;
        int a1 = 10;
        int a2 = 10;
        int a3 = 10;
        int a4 = 10;
        return request.getType().equals(getHandlerType());
    }

    /**
     * 获取处理器类型
     * @return 处理器类型
     */
    protected abstract String getHandlerType();

    /**
     * 判断是否能处理请求
     * @param request 请求
     * @return 是否能处理请求
     */
    private boolean canHandle5(Request request) {
        int a = 10;
        int a1 = 10;
        int a2 = 10;
        int a3 = 10;
        int a4 = 10;
        return request.getType().equals(getHandlerType());
    }

    /**
     * 判断是否能处理请求
     * @param request 请求
     * @return 是否能处理请求
     */
    private boolean canHandle4(Request request) {
        int a = 10;
        int a1 = 10;
        int a2 = 10;
        int a3 = 10;
        int a4 = 10;
        return request.getType().equals(getHandlerType());
    }

    /**
     * 判断是否能处理请求
     * @param request 请求
     * @return 是否能处理请求
     */
    private boolean canHandle3(Request request) {
        int a = 10;
        int a1 = 10;
        int a2 = 10;
        int a3 = 10;
        int a4 = 10;
        return request.getType().equals(getHandlerType());
    }

    /**
     * 判断是否能处理请求
     * @param request 请求
     * @return 是否能处理请求
     */
    private boolean canHandle2(Request request) {
        int a = 10;
        int a1 = 10;
        int a2 = 10;
        int a3 = 10;
        int a4 = 10;
        return request.getType().equals(getHandlerType());
    } }

总结
本文介绍了如何使用 Python 和 javalang 库 实现统计 Java 文件中各个方法的行数,并找到行号对应的方法具体是哪个。

在编写 Python 代码时,我们也应该注重代码的可读性和可维护性,遵循一些基本的编码规范和良好的编程风格,这样有利于提高代码质量和开发效率。

如果您对本文还有什么疑问或建议,欢迎在评论区留言,我会尽快回复并改进文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python脚本寻找Java文件方法 的相关文章

  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • 当玩家触摸屏幕一侧时,如何让 pygame 发出警告?

    我使用 pygame 创建了一个游戏 当玩家触摸屏幕一侧时 我想让 pygame 给出类似 你不能触摸屏幕两侧 的错误 我尝试在互联网上搜索 但没有找到任何好的结果 我想过在屏幕外添加一个方块 当玩家触摸该方块时 它会发出警告 但这花了很长
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 在Python中重置生成器对象

    我有一个由多个yield 返回的生成器对象 准备调用该生成器是相当耗时的操作 这就是为什么我想多次重复使用生成器 y FunctionWithYield for x in y print x here must be something t
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • HQL Hibernate 内连接

    我怎样才能在 Hibernate 中编写这个 SQL 查询 我想使用 Hibernate 来创建查询 而不是创建数据库 SELECT FROM Employee e INNER JOIN Team t ON e Id team t Id t
  • 将 Azure AD 高级自定义角色与 Spring Security 结合使用以进行基于角色的访问

    我创建了一个演示 Spring Boot 应用程序 我想在其中使用 AD 身份验证和授权 并使用 AD 和 Spring Security 查看 Azure 文档 我执行了以下操作 package com myapp contactdb c
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

    我有一个 Pandas 数据框 它有两列 一列 进程参数 列 包含字符串 另一列 值 列 包含相应的浮点值 我需要过滤出部分匹配列 过程参数 中的一组键的子数据帧 并提取与这些键匹配的数据帧的两列 df pd DataFrame Proce
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject

随机推荐

  • 面试时,如何向HR解释自己频繁跳槽?

    有数据显示 现在的职场人 跳槽越来越频繁 95后平均7个月就离职 对于面试官来说 一个跳槽过于频繁的人总是存在潜在风险 比如抗压力差 稳定性不好 心不定这山望着那山高 职业规划不清晰等等 我一直强调一个观点 职场人跳槽 应该是为了下一步有更
  • git配置用户名和密码_IDEA配置码云教程

    第一步 先在电脑上安装git exe 否则以后会出现错误 官方下载地址 https www git scm com downloads 官方中文教程 https git scm com book zh v2 点击自动下载 然后下载好后 选择
  • linux几种压缩命令的简单使用

    在CentOS 7中 常用的解压缩命令是tar gzip和bzip2 压缩命令是tar gzip bzip2和zip 以下是这些命令的使用方法 1 tar命令 tar是常用的归档和压缩工具 可以用来打包 压缩和解压文件 常用的选项有 c 创
  • 《深入浅出React和Redux》(1) - React基础

    create react app React技术依赖的技术栈比较多 比如 转译JavaScript代码需要使用Babel 模块打包工具要使用Webpack 定制build过程需要grunt或者gulp create react app命令可
  • 【Spring容器】项目启动后初始化数据的两种实践方案

    早期业务紧急 没有过多的在意项目的运行效率 现在回过头看走查代码 发现后端项目 Spring MVC MyBatis 在启动过程中多次解析mybatis的xml配置文件及初始化数据 对开发阶段开发人员反复启停项目造成很大的时间浪费 也即是下
  • java设计模式之享元模式通俗易懂

    什么是享元模式 为什么要使用享元模式 享元模式属于结构型设计模式 享元模式主要是为了解决大量对象创建后 增大了系统的资源开销 为了解决此问题 该模式通过共享对象的方式实现 既然是共享肯定有一定结构和策略 通俗易懂的举个例子 我们生活当中需要
  • C#元组学习笔记

    元组功能提供了简洁的语法来将多个数据元素分组成一个轻型数据结构 下面的示例演示了如何声明元组变量 对它进行初始化并访问其数据成员 double int t1 4 5 3 Console WriteLine Tuple with elemen
  • Vue-全局配置axios

    Vue 全局配置axios 1 安装axios npm i axios 2 在main js 引入axios import axios from axios 3 全局配置axios的请求根路径 axios defaults baseURL
  • OAuth原理,图文并茂,通俗易懂

    步骤2请求OAuth登录页 慕课的服务器请求腾讯服务器 步骤3使用第三方账号登录并授权 步骤4返回登录结果 拿到了加密后的code参数 有了code基本上可以确定 用户输入的QQ号和密码 是匹配的 也就是说登录是成功的 但还不够出于安全性的
  • 服务器磁盘如何新建文件夹,如何使用网络硬盘

    网络硬盘是将OA服务器上某一个已经存在的文件夹开放并允许用户通过IE进行共享访问 是一种重要的文件共享方式 类似于文件柜 又区别于文件柜 网络硬盘的存储是将OA服务器上的某个物理存在的文件夹 设置为网络硬盘 换言之 是将文件存储于服务器上特
  • Android TreeView 树形组织结构 带复选框

    之前做项目的时候做人员组织架构时候需要用到 同样可以用于目录视图 简单搜了一下没有合适的 只找到一个基础的有瑕疵的树形结构 就在基础上改了增加了复选框以及简化了部分代码 下面上演示效果图 时长25秒 手机卡见谅 复选框有两种设计模式 1 子
  • SpringBoot 更优雅的实现接口操作日志获取

    SpringBoot 更优雅的实现接口操作日志获取 使用注解 延迟到子类处理的方式实现解耦合 1 定义 Oplog 系统操作日志注解 author chenyusheng create 2023 6 28 9 56 description
  • 字符串系列题目(C++)

    参考链接 https leetcode cn com problems fan zhuan dan ci shun xu lcof solution yi ge mo ban shua bian suo you zi fu chu x6vh
  • 五大常用算法之二:动态规划算法

    一 基本概念 动态规划过程是 每次决策依赖于当前状态 又随即引起状态的转移 一个决策序列就是在变化的状态中产生出来的 所以 这种多阶段最优化决策解决问题的过程就称为动态规划 二 基本思想与策略 基本思想与分治法类似 也是将待求解的问题分解为
  • Spring基础入门2 - IoC容器

    在上文介绍了Spring IoC容器的基本用法 下面做一个稍微复杂点的例子 继续学习Spring的IoC和AoP的 实际 使用 我们假设有一个在线商城OnlineStore 在线商城需要提供一些银行相关服务 假设 因为银行服务的实现是容易变
  • Qt 基于元对象系统实现反射

    背景 C 不支持反射 但使用 Qt 的元对象系统可以实现反射机制 使用反射创建对象 概述 使用 Qt 的元对象系统 可以使用反射来创建对象 需要把构造函数用 Q INVOKABLE 进行标记 类定义示例 class demoClass pu
  • 微信小程序 全局路由拦截

    1 微信小程序 全局路由拦截 utils filter js function loginCheck pageObj if pageObj onLoad let onLoad pageObj onLoad 使用onLoad的话需要传递opt
  • synchronized关键字(一)

    一 线程安全和不安全 非线程安全 在多个线程对同一个对象的实例变量进行并发访问时会出现值被更改 值不同步的情况 线程安全 获得的实例变量的值是经过同步处理的 按照顺序执行 不会出现脏读情况 举个例子 5个销售员 卖同一堆货物 每个销售员在卖
  • 高可用mysql集群搭建(mysql5.6+keepalived)

    1 方案在一定程度上保证主库的高可用 在一台主库down掉之后 可以在极短的时间内切换到另一台从库上 尽可能减少主库宕机对业务造成的影响 1 一台主库 master 提供服务 只负责数据的写入 2 一台数据库服务器资源做master主库的从
  • python脚本寻找Java文件方法

    统计 Java 文件中方法行数 最近接到一个需求 有一个安全扫描 可以扫描到是那个Java文件有问题 但是不知道是该文件下哪个方法有问题 所以想根据行号找到对应方法进行统计 本文将介绍如何使用 Python javalang 库实现这个功能