- 博客(557)
- 资源 (7)
- 问答 (1)
- 收藏
- 关注
原创 用ASM做精准测试(Java)
precise-testing-ASM 是一个基于 Java ASM 字节码框架的方法调用链分析工具,能够从.class文件或JAR包中递归构建方法调用链的DAG结构。该工具支持多态解析、Lambda表达式追踪和循环调用检测等复杂场景,自动过滤JDK类只分析业务代码。通过CallChainAnalyzer入口类可分析指定方法调用链,DagNode表示调用节点,DagTraverser提供多种遍历方式。项目采用Java+ASM技术栈,Maven构建,适用于方法调用关系分析和可视化场景。
2026-05-10 21:57:01
486
原创 Springboot+Vue2的Web项目小白入门Demo快速学习!
Spring Boot + Vue2 学生管理系统 Demo 这是一个前后端分离的教学项目,使用 Spring Boot 2.6.13 后端和 Vue2 + Element UI 前端。项目采用 Maven 多模块结构,通过 frontend-maven-plugin 实现前端资源自动打包到后端静态目录。 核心功能:学生信息的增删改查,包含统一响应封装、全局异常处理等典型开发模式。支持两种运行方式: 一键构建(mvn package 自动打包前后端) 开发模式(前后端独立运行,8080/8081 端口分离)
2026-05-05 18:51:05
1245
原创 传统的JavaWeb项目小白入门Demo快速学习!
Java Web 学生管理系统教学项目摘要 本项目是一个用于Java Web教学演示的简易学生管理系统,旨在帮助初学者理解传统Java Web项目的开发流程和结构。项目采用标准Java Web架构,包含Servlet后端和Vue+Element UI前端,逻辑上实现前后端分离但代码放在同一项目中便于部署。 技术栈: 后端:JDK 1.8 + Servlet 3.1 + Jetty 9.4 前端:Vue 2.x + Element UI + Axios 项目特点: 展示标准Java Web项目结构(Maven
2026-05-04 23:02:33
854
原创 用javaparser做精准测试
使用Javaparser进行Java静态代码分析的方法调用链追踪技术。项目通过解析.java文件构建AST,从指定入口方法出发,分析方法的层层调用关系,生成DAG结构调用链(如示例所示)。相比ASM字节码分析,Javaparser更易用但存在局限:难以处理lambda表达式、多态场景和第三方依赖。作者已开发Javaparser精准测试项目,支持方法节点复用、循环调用检测等特性,帮助开发者精准评估代码变更影响范围。建议根据能否获取.class文件选择Javaparser或ASM工具链。
2026-04-30 21:06:05
479
原创 openclaw 本地基础安装配置
安装引导时候,会出现 model provider,模型供应商的选择,模型供应商会提供很多模型,简单理解,模型供应商就是一种销售渠道,他们可以销售很多产品,比如 openrouter 模型供应商即可提供 minimax 的模型,也可以提供 kimi 的模型。直接 npm 安装,或者 cnpm 安装(当然也有其他命令的安装方式,这里用 npm,毕竟 openclaw 人家基于 nodejs 开发的,直接 npm 安装也简单,npm 命令各系统通用)大厂云部署,我看了下目前都要收费,可能以后免费了呢,说不准。
2026-03-22 01:32:46
585
原创 关于mysql时间类型和java model的日期类型映射
一般情况,你的 jdk 基本都是 >= 8,你的 mysql 一般也是 >= 5.7因此一般情况建议是 mysql 选择 DATETIME,java model 选择 LocalDateTime。
2025-07-30 23:14:50
1017
原创 git stash暂存代码
pop 能使得 stash 的代码应用上去,同时 stash list 中该条记录也被删除,如果你希望应用上去以外,不删除 stash list 中的记录(因为你可能还需要把这个记录应用到其他分支),那么可以如下。当你在一个 A 分支上开发代码,但是还没有开发完,开发了一半,这时候你紧急接到另外一个工作得在 B 分支开发代码并且需要 push 上去,这时候 A 分支上的代码怎么办呢。
2025-07-14 12:47:27
468
原创 java后端限流操作
能够控制 callThirdPartyAPI 内的执行逻辑是均匀分布在 0.0s、0.1s、0.2s…0.9s, 1.0s, 1.1s…一些业务场景中,我使用 java 在后端代码中可能要对某些流程做频率控制,其实会有很多做法,不同的做法适用于不同的场景。比如服务端代码假如要调用某个 open api,这个 api 会有一定的频控,你不想要触发到这个频控。一些简单的对某些流程执行的频率控制。
2025-07-07 17:36:53
464
原创 前端防抖Debounce如何实现
setTimeout 是同步执行,但是被异步调用.setTimeout 是 JavaScript 中的异步操作,它不会阻塞主线程的执行.调用 setTimeout 时,JavaScript 引擎会将回调函数放入任务队列中,等待当前执行栈清空后才执行.setTimeout 的回调函数不会阻塞主线程的其他代码,也就是说直行到setTimeout后,立马执行了console.log了,但是setTimeout内的逻辑是在等待当前执行栈清空后才被执行的。
2025-07-06 18:24:05
350
原创 前端js+vue承接后端SSE流式输出结果
Server-Sent Events:服务器发送事件,是一种基于 HTTP 的轻量级协议,允许服务器主动向客户端推送文本数据(如 JSON、纯文本等)前端监听:.addEventListener(“update”, handler)后端发送:event: update\ndata: {…
2025-06-30 15:17:23
1116
原创 java后端http接口流式输出到前端
Server-Sent Events:服务器发送事件,是一种基于 HTTP 的轻量级协议,允许服务器主动向客户端推送文本数据(如 JSON、纯文本等)如果是你的服务接入了大模型 api,大模型本身做的就是一个流式输出呢?新建高并发/代理外部流式 API → Flux + WebFlux(性能与扩展性更优)后端发送:event: update\ndata: {…代码内部直接承接大模型 api 调用,然后流式输出到前端。每个请求占用一个线程,高并发时资源消耗大。每个请求占用一个线程,高并发时资源消耗大。
2025-06-30 12:07:19
2174
原创 godot2D复刻多种经典小游戏合集
最近在学习 godot 游戏引擎,在做一些经典小游戏 demo。按键与蛇运动方向相同会让蛇以 2 倍速度移动。随机食物与随机 snake 开始位置。游戏介绍:复刻经典飞翔的小鸟小游戏。游戏介绍:复刻经典贪吃蛇小游戏。吃到食物后蛇身增长 1 格。点击屏幕可控制小鸟向上飞。小鸟飞得分与存储最高分。方向键可操控蛇的移动。
2025-06-19 23:56:17
1378
原创 godot小白入门前的一些前置知识了解
因为游戏是由很多场景构成,比如超级玛丽的在跳跃的整个页面,比如超级玛丽是一个场景,怪兽也是一个场景等,超级玛丽这个场景中是由一个主节点,下方挂了很多字节点组成的,比如它下头可能挂了图像节点,专门给超级玛丽展示图片的,还挂了碰撞检测节点,这个节点的能力是专门用来检测超级玛丽有没有被怪兽碰撞的,等等。简单理解,你从官网下载了 godot 包之后,下载到电脑上就是一个软件,这个软件可以理解成是视频制作软件(PR,PS)和代码编写软件(idea,rider)的集合,其中既可以写代码,也可以调整视频和图片。
2025-06-08 12:58:05
1221
1
原创 github开源协议选择
修改后的代码必须开源,商业用途、修改、分发,衍生作品必须使用 GPL 协议,强调开源精神的项目。即使通过 SaaS(云服务)使用,也必须开源,商业用途、修改、分发,防止云服务公司闭源使用代码。可商用闭源,修改后也无需开源,适合个人项目,非常宽松。允许商业用途、闭源、修改、分发。核心保留版权声明、许可证文件,明确包含专利授权条款。允许商用,闭源,修改。如:Android、Kubernetes、Apache Kafka。如:React、Vue.js、jQuery。如:Linux、GCC、Git。
2025-06-08 12:04:07
1028
原创 github中main与master,master无法合并到main
github 采用 main 替代 master 作为主分支不是出于技术背景,而是出于 2020 年全球范围内兴起的 “Black Lives Matter”上传 github 时候,发现传上去的是 master,但是 github 竟然还有一个 main。从 Git 2.9 版本开始,Git 默认不允许合并没有共同祖先的分支,以此避免意外合并两个不同项。然后在 2020 年 6 月宣布将默认分支名称从 master 改为 main 了,,,如果是本地已经有的项目,使用 master 分支名。
2025-06-07 23:02:36
1007
原创 java中concurrent包常用的集合类操作
常规的集合类,比如 ArrayList,HashMap 当作为多线程下共享的变量时候,操作它们时会涉及线程安全的问题。典型应用:存储热点数据,避免重复计算;适合:读多写少的场景(因为写操作时复制底层数组,读操作无需加锁)适合:需要频繁读写的线程安全的场景。
2025-06-01 18:55:25
343
原创 java synchronized关键字用法
它为了解决多线程环境下资源的竞争问题。通过互斥锁机制,确保同一时间只有一个线程可以执行同步的代码。线程对共享变量的修改会立即刷新到主内存中,其他线程可以立即看到最新的值。锁对象:当前类的 Class 对象(如 MyClass.class)锁对象:可以灵活指定(如 this、Class 对象或自定义对象)锁对象:当前实例对象(this)
2025-06-01 18:36:18
424
原创 java 多线程中的volatile关键字作用
jvm 规定,每个线程有自己的工作内存(本地缓存),对变量的读写一般在自己的工作内存(本地缓存)中进行,如果一个线程修改了共享变量的值,其他线程可能无法立即看到最新的值,因为工作内存(本地缓存)还未被更新的原因。假设 A,B 线程同时执行,假设按照操作1 - 2 - 3 - 4 这样的操作顺序执行下来,线程B看到 flag == true 时,a 应该已经被赋值为 1,所以 b 的值是 1,输出 1。volatile 声明的变量,写操作时强制将变量的修改立即刷新到主内存;
2025-06-01 17:58:32
467
原创 springboot中@Async做异步操作(Completable异步+ThreadPoolTaskExecutor线程池+@Async注解)
默认情况下,@Async 使用 Spring 的 SimpleAsyncTaskExecutor 线程池(最大线程数为 Integer.MAX_VALUE),一旦请求激增,有可能会导致 cpu 陡增和内存陡增,导致服务崩溃强烈建议自定义线程池!// 核心线程数 executor . setMaxPoolSize(10);// 最大线程数 executor . setQueueCapacity(100);
2025-06-01 17:24:03
810
原创 java ExecutorService线程池使用(ExecutorService/Completable异步+ExecutorService线程池)
使用自定义配置的线程池,// 核心线程数// 最大线程数// 非核心线程空闲存活时间// 有界队列// 拒绝策略,默认就是拒绝策略// 创建自定义线程池unit,workQueue,handler// 创建自定义线程池(周期性执行)unit,workQueue,handlerCPU 密集型:CPU 核心数 + 1(减少上下文切换)IO 密集型:2 * CPU 核心数(线程常阻塞,需更多线程)根据系统资源设置,避免资源耗尽(如 corePoolSize * 1.5)
2025-06-01 16:45:21
1465
原创 java CompletableFuture创建异步任务(Completable异步+ExecutorService线程池)
推荐根据业务需求配置10, // 核心线程数20, // 最大线程数60L, TimeUnit.SECONDS, // 空闲线程存活时间new LinkedBlockingQueue<>(100), // 任务队列new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略如果使用自定义线程池,确保在任务完成后关闭线程池(executorService.shutdown())
2025-06-01 12:46:10
491
原创 springboot配置cors拦截器与cors解释
其实本质是可以这么理解:具体哪个域名可以请求我的后端服务接口,是由我后端自己控制的,我后端可以控制成让 aaa.com 的域名可以访问,也可以控制成让 bbb.com 的域名可以访问,本质是浏览器先发一个 options 预检请求,通过响应头让浏览器知道能否跨域访问,可以的话就访问了,不可以的话浏览器就报 cors 错误。当浏览器访问 aaa.com 的页面,并向 bbb.com/list 发起请求时,浏览器会先检查是否跨域:由于 aaa.com 和 bbb.com 的域名不同,属于跨域请求;
2025-05-29 14:38:10
688
原创 mybatis的mapper对应的xml写法
在MyBatis中,如果不写这样的条件判断,如果是对表的写操作,如 update,其中的 set 中当name参数为null时,生成的SQL语句会直接包含name = null,从而将数据库中的对应字段更新为NULL。如果没写 @Param,MyBatis 默认将未使用 @Param 注解的参数封装为 Map,键名为 param1、param2、…if 是独立的判断,而 choose when 更像 ifelse 逻辑,一旦判断一个满足,后续的 when 就不执行了!是可选的,但如果省略且所有。
2025-05-28 20:51:03
2187
原创 java中自定义注解
/ 元注解:定义注解的行为@Retention(RetentionPolicy.RUNTIME) // 注解在运行时保留,可通过反射读取@Target(ElementType.METHOD) // 注解只能用于方法上// 成员变量(带默认值)@Service@LogExecution("创建用户")
2025-05-28 16:24:35
493
原创 springboot配置mybatis debug的sql日志输出
在 src/main/resources/log4j2.xml 中配置 MyBatis Mapper 包的日志级别为 DEBUG,并指定输出目标(控制台或文件)开发测试环境你可以配置上这个,方便快速定位问题,生产环境不建议开启,开也是临时开启为了排查线上问题。additivity=“false” 表示不将日志传递给父级 Logger(避免重复输出)实际开发中,生产/开发/测试环境,不同的环境对应各自的 log4j2.xml。
2025-05-28 13:50:49
833
原创 mysql explain使用
通过 EXPLAIN 你可以知道:如是否使用索引、扫描多少行、是否需要排序或临时表EXPLAIN 三板斧(type、key、Extra)
2025-05-27 17:47:54
680
原创 mysql中的索引怎么用?
即逐行读取表中的所有数据块,并检查每一行是否满足查询条件如果你的查询请求的数据不仅仅包含索引中的列(即索引没有覆盖查询所需的全部列),那么数据库还需要根据索引中记录的位置信息回到表中去取这些额外的数据。这一过程就是所谓的“回表”。由于需要额外的I/O操作来访问数据行,回表通常会增加查询的开销为了避免回表带来的性能损耗,一种策略是创建覆盖索引。覆盖索引是指一个索引包含了查询语句中所有需要的数据列。在这种情况下,数据库可以从索引中直接获取所有需要的信息,而无需访问表中的数据行,从而避免了回表操作。
2025-05-27 16:32:54
1259
原创 java8函数式接口(函数式接口的匿名实现类作为某些方法的入参)
是 Java 8 引入的核心概念之一,指的是 仅包含一个抽象方法的接口。它可以被 @FunctionalInterface 注解标记(可选),但即使不标记,只要满足“只有一个抽象方法”的条件,编译器也会将其视为函数式接口函数式接口可以作为 Lambda 表达式的目标类型往往通过 lambda 表达式的写法,使用一个匿名类,来实现一个函数接口。
2025-05-26 21:58:25
480
原创 springboot中拦截器配置使用
Spring Boot 在启动时会自动扫描所有实现了 WebMvcConfigurer 接口的配置类,并调用其方法(如 addInterceptors)。Spring MVC 会通过反射调用 addInterceptors 方法,将拦截器注册到 Spring MVC 的处理链中。Spring Boot 的拦截器顺序由 InterceptorRegistry.order() 控制,@Order 注解不会生效。postHandle() 和 afterCompletion() 执行顺序,先注册确后执行。
2025-05-25 22:53:09
965
原创 springboot中过滤器配置使用
你使用javaspringboot过滤器 filter 用在请求到达 controller 之前或者响应返回给用户之前往往可以用 filter 来做请求的修改,日志、权限、跨域等场景,例如:设置编码和字符集,请求头,状态码等过滤器是在请求进入容器后,但请求进入 servlet 之前进行预处理的,请求结束返回也是,是在 servlet 处理完后,返回给前端之前拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不行,在拦截器里注入一个 service,可以调用业务逻辑。
2025-05-25 18:27:18
1451
原创 springboot配置redis lettuce连接池,以及连接池参数解释
如果默认按照 shareNativeConnection = true,Lettuce 会始终使用一个物理连接,所有线程共享这个连接,不会生成第二个新的连接,连接池参数不生效,官方推荐默认值,因为已经适合了大多数场景,单个连接即可满足高并发需求,避免资源浪费。lettuce 连接池的特点是:一个 lettuce 连接可以被多个线程复用,不需要频繁创建连接,其实是通过 Netty 实现了异步非阻塞,单连接即可支持高并发。
2025-05-23 18:36:13
3214
原创 springboot配置mysql druid连接池,以及连接池参数解释
空闲连接:当一个连接使用完毕,并通过相应的归还机制(例如关闭连接对象)返回到连接池中时,它就成为了空闲连接,等待下一次被获取和使用。在 springboot 的 application.yml 中配置基本方式。空闲时:定义空闲时,即上一次连接归还,到下一次连接被请求使用 之间的时间。活跃连接:未归还到连接池的。
2025-05-23 17:26:42
1018
原创 mysql连接池druid监控配置
然后如果项目使用 Servlet 3.0+ 并支持注解,可以通过 Java 配置类注册来代替上方的在 web.xml 中的配置:你可以写一个 DruidWebConfig 类来继承 ServletContextListener,再重写其中 contextInitialized 方法,其中你可以注册 StatViewServlet 和 WebStatFilter,然后再 web.xml 配置一个监听即可。如果你配置了 druid 的一些基本连接池的内容,这里不赘述,那么你肯定引入了 druid 的依赖了。
2025-05-23 15:27:30
960
原创 tomcat 目录结构组成
现在非常多的 java web 服务部署在 linux 服务器中,我们服务器中的 tomcat 会有各种文件路径,看下它有哪些文件。
2025-04-02 16:52:33
689
原创 java maven依赖传递以及版本冲突
依赖中 exclusions 掉某个子依赖,目的是防止内部依赖往外部传递,比如 A -> B,B 项目中有 C 依赖,如果 A 没有直接的 C 依赖,那么 A 使用的是 B 中的 C 依赖的版本,当 B exclusion 掉了 C,则表示这个 C 依赖无法传递到 A。首先得明确,并不是 A 自己的代码逻辑使用 4.0 的 C,然后 A 项目中运行到 B 中的代码时候就按照 1.0 的 C 去跑,并不是这样的,统一在 runing 的 A 项目统一使用一个版本的 C 的依赖在 run。
2025-03-14 19:22:22
717
原创 服务调用时,多种超时时间的差别
我们在进行服务调用时候,可能会看到非常多的超时时间的配置,那这些不同的超时时间的配置有啥区别呢?一般较成熟的企业,当作服务调用时候,会有比较成熟的各种超时时间的默认配置,和配置介绍说明。
2025-02-25 13:42:39
521
原创 调用下游时候发现超时一般怎么排查
如果在调用方的超时错误日志中强制记录下游服务唯一标识(如服务名/IP+端口),这样上游也能很快判定出下游哪个服务有问题(好的方式)排查 sql 慢查询(mysql 的 slow_query_log),企业工程侧一般会有一些 mysql 平台能看到这些慢查询记录。一般工程侧,各公司会有一些 trace 追踪平台或者工具,能够查出来调用链的情况,然后下游服务的调用时间也会有展示出来。长期可以针对性的优化,比如数据库问题优化数据库,多线程问题优化多线程代码。有些企业平台侧能看到上有调用超时的记录情况图表。
2025-02-21 18:01:48
676
原创 后端开发-分页游标设计(解决大数据量分页查询时的性能问题)
一般来说 order by 的不是索引字段,或者这个字段不能添加索引,那么不建议分页游标来做,如果非要用分页游标,也需要你贴紧一个有唯一索引的字段来做,但即使是这样,首页查询也会全表扫描,后续页查询时因为会先执行 where 中的语句能缩减一点点范围。如果使用一页一页的查找数据,按照每页 10 条查找,你查找第一页,因为 id 是主键索引你能快速查找到,然后后端多返回查找到的最后一条数据的这个索引字段 id(要求这个索引需要唯一)如果你遇到的是上方描述的场景,那么分页游标就是你很好的选择!
2025-02-20 18:27:26
1508
mysql练习题-sql建表文件.txt
2020-03-12
typora-cobalt-theme-master-v1.1.zip
2020-06-01
Xcode Midnight.jar.zip
2020-05-30
Windows Update Blocker v1.1.zip
2020-04-19
mysql练习题-sql_practice.pdf
2020-03-12
datagrip 数据库切换主键的问题
2024-11-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅