自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(129)
  • 收藏
  • 关注

原创 根据文本自动生成UML时序图(draw.io格式)-支持自动换行

1. 前言已有一些工具可以根据文本自动生成UML时序图,如PlantUML(https://plantuml.com/zh/)、Mermaid(https://mermaid-js.github.io/mermaid/)等。但存在一些使用不便之处,例如激活需要手工指定、语法较复杂,不便于记忆、部分功能使用频率较低、不便于人工继续编辑、展示的样式与常见的UML时序图不同等。因此使用Java开发了以下根据文本自动生成UML时序图的工具,激活能够自动生成、语法简单便于记忆,支持大部分UML时序图的功能、生成d

2021-10-02 22:43:14 25397 12

原创 Java方法完整调用链生成工具

1. 前言在很多场景下,如果能够生成Java代码中方法之间的调用链,是很有帮助的。IDEA提供了显示调用指定Java方法向上的完整调用链的功能,可以通过“Navigate -> Call Hierarchy”菜单(快捷键:Ctrl+Alt+H)使用;Eclipse也提供了相同的功能。但以上都需要针对每个方法进行手工处理,拷贝出来的文本无法展示调用层级,且不支持生成指定Java方法向下的完整调用链。以下实现了一个工具,能够批量生成指定Java方法向下的完整调用链,对于关注的Java方法,能够生成其

2021-07-05 02:06:22 31595 45

原创 Java单元测试实践-00.汇总(9万多字文档+700多测试示例)

1. 前言以下内容提供了Java单元测试实践总结,包含9万多字文档,与700多个测试示例。2. 相关文档地址01.单元测试概述与示例02.JUnit使用03.spring-test使用04.使用IDE执行单元测试05.Mockito、PowerMock基本使用06.Mock后Stub静态方法07.Answer与未Stub的静态方法08.Stub、Replace、Suppress静态方法09.Mockito的Stub参数条件10.非静态方法Moc

2020-08-12 23:37:20 5705 5

原创 石墨文档批量导入飞书文档方法

本文介绍了将文档从石墨批量迁移到飞书的方法。首先需要在Windows环境下从石墨文档下载文件,然后通过飞书云盘上传。具体步骤包括:访问石墨文档获取文件,登录飞书云盘后选择"上传文件夹"功能,选中本地下载的文档目录完成上传。上传后会在云盘生成同名目录包含所有迁移文件。该方法解决了石墨与飞书文档无法直接互导的问题。

2025-12-26 23:30:53 403

原创 石墨文档批量下载方法

本文介绍了从石墨文档批量下载文件的详细操作步骤。首先需要在Windows环境中下载并解压提供的工具包,其中包含完整的Python运行环境。使用时需修改配置文件config.properties,设置请求间隔时间、目标文件夹GUID、本地保存路径和登录Cookie参数。配置完成后双击run.bat即可开始下载,文件将按类型保存为.docx、.xlsx、.pptx等格式。执行日志保存在log目录中,便于检查下载结果。整个过程无需额外安装Python环境,操作简单明了。

2025-12-26 23:29:04 375

原创 Python依赖库离线安装

本文介绍了在无网络环境下离线安装Python依赖库的方法。首先在联网环境中使用pip download命令下载指定版本的依赖包,需注意Python版本兼容问题。然后将下载的包传输到离线环境,创建Python虚拟环境后,使用pip install --no-index命令从本地目录安装这些依赖。最后通过执行测试脚本验证安装结果。这种方法适用于需要在隔离网络环境中部署Python应用的情况。

2025-12-24 21:42:42 723

原创 JarDiff比较jar文件版本差异及代码影响范围

JarDiff是一个基于java-all-call-graph组件的工具,用于比较JAR文件新旧版本的差异并分析代码影响范围。主要功能包括:通过忽略版本号比较JAR文件名前缀;逐类逐方法比较方法签名和字节码;检测常量值变更对方法的影响;生成修改方法的调用链和调用堆栈分析报告。工具会输出三类结果文件:修改方法基本信息汇总、向上调用堆栈信息汇总,以及详细的调用链文件和Markdown格式的调用堆栈。该工具特别适合用于分析JAR版本升级带来的代码变更影响,帮助开发者快速定位关键修改点。

2025-12-13 23:07:37 1432 1

原创 Java应用JDK及依赖库兼容问题扫描工具

本文介绍了一款用于检测Java应用在升级JDK或依赖库时可能出现的兼容性问题的工具。该工具可扫描"Jar Hell"问题,包括找不到的类、不可访问的方法/字段等,避免在生产环境出现异常。工具提供快速检查模式(2-4分钟)和完整检查模式(15-35分钟),支持JDK8+环境,使用H2本地数据库。执行结果以Excel文件输出,用户可筛选关注的问题类。该工具帮助开发者在编译和测试阶段发现潜在的兼容性问题,降低生产环境风险。

2025-12-13 23:06:23 536

原创 静态分析生成Java代码方法调用堆栈

本文介绍了使用java-all-call-graph工具进行Java代码静态分析,生成方法调用堆栈的技术方案。该工具支持从起始方法到目标方法之间的调用路径分析,可向上查找调用入口或向下追踪特定方法调用。文章详细说明了配置参数、入口类、示例代码以及生成的调用堆栈文件格式,包括向上和向下两种调用堆栈的生成方式。通过该方法调用堆栈分析,可评估方法影响范围或追踪业务操作执行路径。

2025-12-08 22:47:04 713

原创 静态分析生成Java代码方法完整调用链

本文介绍了java-all-call-graph项目,该工具通过静态分析批量生成Java方法的完整调用链。支持两种调用链生成方式:从指定方法向下追踪所有被调用的方法,或向上追踪所有调用该方法的方法。适用于代码执行流程分析、影响范围确认、应用功能拆分和代码审计等场景。项目提供了扩展功能,可自动生成UML时序图,并支持方法过滤和自定义判断逻辑。生成的调用链文件包含类名、方法名、参数、行号、注解等详细信息,帮助开发者快速理解复杂调用关系。工具弥补了IDE手动分析方法的不足,提高了代码分析和问题定位的效率。

2025-12-08 22:43:47 978

原创 对Java代码静态分析并支持SQL查询

java-all-call-graph 是一个 Java 代码静态分析工具,支持将编译后的 Java 代码信息写入数据库(MySQL/H2/PostgreSQL),并通过 SQL 查询分析结果。该工具基于 java-callgraph2 项目实现解析功能,能够分析类、方法、字段、注解等代码元素,并支持 Spring、MyBatis 等常用框架。项目提供多种数据库配置选项,其中推荐使用本地 H2 数据库以获得更快的读写速度。用户可以通过配置文件或代码方式指定参数,支持灵活的数据分析需求。

2025-12-08 22:41:23 1194

原创 Java静态分析与调用链工具java-all-call-graph使用说明

Java静态分析工具java-all-call-graph提供全面的代码分析功能,支持生成方法调用链、调用堆栈、SQL查询等。该项目已被vivo、自如、携程等企业应用于代码安全扫描、瘦身优化等场景。核心功能包括:解析Java代码结构信息入库;生成完整方法调用链及堆栈;分析MyBatis操作的表名;Jar文件差异比较;兼容性检查等。通过结构化存储代码信息,为开发测试提供数据支持。项目采用模块化设计,java-all-call-graph依赖java-callgraph2实现底层分析能力,支持微信群交流和大模型

2025-12-08 22:36:38 1064

原创 Java静态分析工具java-callgraph2使用说明

java-callgraph2 是一个用于Java代码静态分析的工具,支持解析class、jar等文件,生成结构化数据用于自动化分析或大模型处理。该项目fork自java-callgraph,但已大幅优化增强,专注于静态分析Java方法调用关系。主要功能包括:解析类、方法、字段等基本信息;记录继承、实现关系;分析内部类;追踪方法调用关系(含调用类型、常量值、变量类型等详细信息)。特别支持解析方法调用中的常量值、变量类型、静态/非静态字段等信息,并能识别方法返回值来源。该项目可作为基础工具用于代码分析或时序图

2025-12-08 22:29:24 683

原创 Java应用升级JDK或依赖库可能遇到的兼容性问题

Java版本升级常见兼容性问题汇总:当升级JDK或依赖库版本时,主要会出现三类异常:1)类不存在(NoClassDefFoundError);2)方法变更(NoSuchMethodError/IncompatibleClassChangeError),包括方法删除、访问权限变更、静态/非静态转换、返回类型改变等情况;3)字段变更(NoSuchFieldError/IllegalAccessError),涉及字段删除、访问权限变更、静态/非静态转换等问题。这些错误在JDK 8/17/21中表现一致,主要差异在

2025-12-07 20:52:13 504

原创 MCP client支持同时连接多个MCP server-使用Python开发

本文介绍了如何使用 Python 开发一个支持同时连接到多个 MCP server 的客户端。通过 AsyncExitStack 管理异步资源,客户端可以遍历多个 MCP server 的 URL,建立会话并获取每个服务器支持的工具信息。这些工具信息被存储在 available_tools 数组中,并通过 tool_session_map 映射工具名称与对应的会话对象。客户端调用 OpenAI 的 Chat Completions API,使用 available_tools 作为参数,并根据大模型返回的工

2025-05-10 22:50:58 1268

原创 MCP server支持在不同Python脚本中实现工具方法

本文介绍了如何在多个 Python 脚本中实现 MCP server 工具的开发。通过使用 FastMCP 对象和 add_tool 方法,可以在不同的类中注册工具,并在主脚本中启动服务。具体步骤包括:在主脚本中创建 FastMCP 对象并调用 run 方法启动服务;在其他脚本中定义工具类,并在初始化方法中使用 add_tool 注册工具。这种方式替代了 @mcp.tool 装饰器,适用于多脚本协作的开发场景。

2025-05-10 22:49:49 906

原创 MCP细节与原理分析-使用Python+SSE传输机制

本文介绍了基于 Python 和 SSE(Server-Sent Events)传输机制开发的 MCP(Model Context Protocol)示例项目,并对其细节与原理进行了分析。SSE 是一种服务器向浏览器推送数据的技术,MCP 利用 SSE 实现客户端与服务器之间的流式通信。MCP 服务器提供两个接入点:SSE 接入点用于接收服务器推送的消息,标准 HTTP POST 接入点用于客户端发送消息。通信过程采用 JSON-RPC 2.0 协议,连接初始化包括客户端发送初始化请求、服务器响应协议版本及

2025-05-10 22:48:54 1685

原创 MCP client开发与日志分析-使用Python+SSE传输机制

本文介绍了MCP(Model Context Protocol)客户端的开发流程,重点包括环境依赖、环境变量设置、MCP客户端创建、与MCP服务器建立连接、以及访问大模型和执行工具的方法。开发过程中,需安装MCP Python SDK,并通过.env文件配置大模型相关环境变量。与MCP服务器建立连接时,使用sse_client()方法,并通过ClientSession类初始化会话。访问大模型时,使用OpenAI格式的Chat Completions API进行Function Calling,首次访问时需在

2025-05-10 22:46:45 1407

原创 MCP概念与server开发及调试-使用Python+SSE传输机制

MCP(Model Context Protocol)是由Anthropic发布的一项新标准,旨在连接AI助手与数据存储系统,提升模型响应的质量和精准度。MCP通过提供通用开放标准,解决了AI系统与数据源之间的割裂问题,简化了数据访问机制。MCP采用client-server架构,支持多种传输机制,如Stdio、HTTP SSE和Streamable HTTP,并通过JSON-RPC 2.0协议进行消息交换。MCP server提供三大核心功能:Resources、Tools和Prompts,其中Tools

2025-05-10 22:44:50 2327

原创 MCP之大模型Function Calling开发与原理

MCP(模型控制协议)的实现可以借助大模型的Function Calling(工具调用)功能,尽管这不是必须的。Function Calling允许大模型选择并执行工具,应用程序负责收集工具信息、执行工具并将结果返回给大模型。OpenAI和阿里云百炼均提供了相关接口和文档,如Chat Completions API,用于实现Function Calling。API中的messages数组包含不同角色的消息,如system、user、assistant和tool,分别用于指定模型策略、用户问题、模型回复和工具

2025-05-10 22:21:52 1164

原创 Java创建进程读取Process.getInputStream阻塞问题

在某个 k8s pod 中,通过 Java 代码创建进程执行其他程序时,被阻塞了很久。

2025-01-26 12:58:33 1066

原创 Java反射导致Metaspace OOM分析方式、工具与解决方法

反射膨胀机制对同一个方法重复生成类的情况,出现在为某个类的构造函数生成 GeneratedConstructorAccessor… 类,或为非构造函数方法生成 GeneratedMethodAccessor… 类的阶段,当方法对应的类生成完毕以后,后续再通过反射调用该方法时,会使用已经生成好的类,不会再继续生成类,即不会无限为同一个方法重复生成类因此,反射膨胀机制对同一个方法重复生成类的情况,一定程度上可能导致占用 Metaspace 空间进一步增大,具体比例与 Java 应用处理请求的并发有关。

2024-12-31 23:23:22 1759

原创 Java通过反射调用方法源码分析

当前方法通过反射调用次数大于 JVM 参数 sun.reflect.inflationThreshold 值时,会为对应的方法生成类,并将该类赋值到对应的 DelegatingMethodAccessorImpl 类的 delegate 字段;即后续都会调用生成的类的方法。

2024-12-31 22:25:21 818

原创 获取Java反射生成的GeneratedMethodAccessor等类的原始方法

在分析 Java Metaspace OOM 问题时,可能需要获取 Java 反射生成的 sun.reflect.GeneratedMethodAccessor…、sun.reflect.GeneratedConstructorAccessor…、sun.reflect.GeneratedSerializationConstructorAccessor… 类对应的原始方法目前可以使用的方法步骤相对较多,耗时很长,因此开发了简化的工具快速获取。

2024-12-31 22:11:37 1307

原创 Git批量操作脚本-检查分支合并、合并分支创建TAG等

以下实现了 Git 批量操作脚本,可以针对某个目录下的所有 Git 本地仓库进行快速批量操作不依赖 Git 外的额外环境支持在任意目录使用对应命令支持 TAB 键补全命令与参数。

2024-11-02 17:52:08 1129

原创 TortoiseGit Revision graph快速打开方式

在 Windows 环境下,假如要打开 TortoiseGit 的 Revision graph 窗口,操作不是很方便,需要先在资源管理器中 Git 本地仓库对应的目录图标上或目录空白处点击鼠标右键,点击 TortoiseGit 菜单,再点击 Revision graph 菜单假如有很多 Git 本地仓库都需要打开 Revision graph 窗口,以上操作就更加费时通过以下方式可以实现快速打开 TortoiseGit Revision graph 窗口。

2024-11-02 17:44:50 698

原创 Java线程池关闭、等待、线程结束与JVM退出

线程池关闭后的操作执行结果 / 线程池关闭方式对正在执行任务的影响没有影响线程会被中断是否丢弃队列中的任务不丢弃丢弃是否等待存量任务执行完毕不等待不等待使用 awaitTermination() 方法等待结束的任务范围正在执行的任务 + 队列中的任务正在执行的任务继续执行任务使用拒绝策略处理任务使用拒绝策略处理任务活跃线程结束方式任务执行完毕后结束1. 线程被中断后结束2. 任务执行完毕后结束空闲线程结束方式线程被中断后结束线程被中断后结束。

2024-09-27 20:33:29 1897 1

原创 text2sql框架-DB-GPT使用总结

DB-GPT 是一个开源的 AI 原生数据应用开发框架。

2024-07-13 20:20:51 2299

原创 text2sql框架-vanna使用总结

ChromaDB_VectorStore、MyCustomLLM、MyVanna 类都通过 config 接收使用的配置参数在创建 MyVanna 类时,可通过 config 传递配置参数MODEL_URL = "模型接口的 URL,http://xxx"MODEL = "模型名称"API_KEY = "模型提供的 API KEY"CHROMADB_PATH = "保存 ChromaDB 数据库文件的目录路径"

2024-07-13 20:19:37 6255

原创 MyBatis拦截器动态注册

MyBatis拦截器动态注册

2024-06-02 23:10:03 1316

原创 Druid过滤器动态注册

Druid过滤器动态注册方式

2024-06-02 23:08:07 848

原创 Spring Bean创建顺序与@Order注解

Spring Bean创建顺序,及@Order注解等可以控制的顺序

2024-06-01 12:06:52 1661 3

原创 MySQL、MariaDB、TiDB时间小数秒四舍五入与截断

在 Java 代码中将某个时间以 String、long 格式在不同系统间传递时,假如不同系统使用的数据库对超过精度时间小数秒的处理不同,当以上时间的小数部分大于等于 0.5 秒时,不同系统记录的同一个时间会相差 1 秒。假如在某系统的 Java 代码中将 Date 类型的时间写入 MySQL/TiDB 数据库精度为秒的 DATETIME、TIMESTAMP 等字段,则大约一半的时间为当前时间,一半的时间为下一秒。MariaDB 在插入时间时假如超过字段的精度,会进行截断,不会进行四舍五入。

2023-12-08 21:02:00 1633

原创 MyBatis SqlSession事务与批量执行正确方式(默认不生效)

某些情况下会使用MyBatis的SqlSessionFactory.openSession()方法获取SqlSession对象,再进行数据库操作,但默认情况下SqlSession的事务与批量执行均不生效,假如希望使用SqlSession时事务或批量执行能够生效,则需要进行额外的处理。

2023-03-06 20:28:02 14569 2

原创 MySQL中Spring管理的事务开启后不提交引起的事故

了解到一个事故,在MySQL数据库中,使用Spring管理的事务在开启以后没有在操作结束时提交或回滚,使得原有线程在后续执行数据库操作时可能继续使用原有事务,且不会提交,导致对数据库的修改在Java应用层认为是成功,但在数据库层最终是没有生效的,产生了比较严重的后果

2023-01-28 21:53:13 9720 5

原创 解析MyBatis XML中的数据库表名(支持MySQL)

当前项目用于解析MyBatis XML文件中sql语句使用的数据库表名,支持使用MySQL数据库(或兼容MySQL协议的数据库)的情况。

2023-01-01 18:00:25 2190 2

原创 Jackson @JsonProperty重复字段处理

使用Jackson进行JSON序列化时,假如通过@JsonProperty注解指定了重复的字段(Java中的字段名称不同,但@JsonProperty注解属性中的名称相同),在不同情况下会有不同的结果,以下进行分析。以下使用的Jackson版本为2.14.0。

2022-11-25 20:43:49 3981

原创 数据源使用错误导致MySQL事务失效分析

在Java应用中使用MySQL数据库时,可能出现因为使用的数据源或数据库会话错误,导致事务失效的问题。在Java应用中使用多数据源时,可能在执行SQL语句的不同阶段使用了不相同的数据源,导致事务失效,以下主要对此类问题进行分析。...

2022-08-27 22:41:53 1930

原创 Spring、MyBatis、Druid、MySQL执行SQL语句与事务监控

Druid支持使用自定义Filter,可对SQL语句与事务执行按照需要进行监控。使用Druid自定义Filter监控SQL语句与事务执行的效果,可参考“数据源使用错误导致MySQL事务失效分析”。在Spring XML中,可通过以下方式,在“com.alibaba.druid.pool.DruidDataSource”对应的bean中配置Druid自定义Filter。上类FilterEventAdapter为FilterAdapter的子类。...

2022-08-27 22:39:35 1824

原创 Spring、MyBatis、Druid、MySQL使用事务执行SQL语句分析

使用MySQL数据库时,使用事务与不使用事务相比,出现问题时排查更复杂。不使用事务时,客户端只需要请求MySQL服务一次(只考虑显式执行的SQL语句);使用事务时,客户端至少需要请求MySQL服务四次(开启事务、执行SQL语句、提交/回滚事务、恢复自动提交)。在Java中存在一些用法会导致事务失效,有的问题比较明显可以较快定位,有的问题隐藏较深可能需要较长时间排查。因此需要对MySQL的事务执行原理进行分析,并整理用于排查事务相关问题的快速有效的方法。...

2022-08-27 22:38:10 1461

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除