知其然,知其所以然
Java 内部原理 2026-10-04

RowSet:可断开连接的数据集

在 JDK 21 上用 PostgreSQL 真实验证 RowSet:CachedRowSet 断开连接后离线增删改并 acceptChanges 写回(要 autocommit=false,否则改动已提交却抛异常);写回前先 SELECT 比较原值做乐观冲突检测;WebRowSet XML、序列化、FilteredRowSet、JoinRowSet、分页、JdbcRowSet。

Java RowSet CachedRowSet JDBC 离线结果集 乐观并发 真实验证 动画演示
Java 内部原理 2026-10-04

JTA 两阶段提交:跨资源事务如何协调

用自己起的 PostgreSQL 与 MySQL 跑真实的 XA 两阶段提交:start / end / prepare / commit 的流程、prepare 之后数据仍不可见、PG 延迟约束在 PREPARE 时失败触发回滚、协调者在 prepare 之后崩溃留下握着锁的 in-doubt 分支并通过 recover() 恢复、两阶段每次提交约 0.61 ms(单库本地 0.19 ms)。

Java JTA XA 两阶段提交 PostgreSQL MySQL in-doubt 真实验证 动画演示
Java 内部原理 2026-10-04

Java RMI:远程对象调用的生命周期

用两个 JVM 真实运行 Java RMI:stub 是动态代理、监听两个端口、一次本机调用约 0.072 ms;参数按值而 Remote 对象按引用;异常原样穿过;JEP 290 过滤器拒绝 ArrayList;DGC 租约到期后 unreferenced() 在 3.01 秒后被调用、clean 调用则在 0.01 秒内。

Java RMI 远程调用 DGC 序列化过滤器 stub 真实验证 动画演示
Java 内部原理 2026-10-04

JNDI 资源查找:名字空间与对象绑定

在 JDK 21 上真实运行 JNDI:没有提供者时的 NoInitialContextException、自己写的 InitialContextFactory、JDK 自带的 RMI Registry 提供者(只能 bind Remote / Reference / Referenceable)、JDK 的 LDAP 提供者对接 UnboundID 内存 LDAP 服务器的查询与修改及错误映射。

Java JNDI InitialContext LDAP RMI 命名服务 真实验证 动画演示
Java 内部原理 2026-10-04

JUnit 5 扩展模型

用 JUnit 5.11.3 真实打印扩展回调的完整顺序:before 类按注册顺序、after 类反过来;异常处理器吞掉异常后后面的处理器不再被调用;TestWatcher 的三种回调;Store 在根 / 类 / 方法三级的 CloseableResource 关闭时机;@RegisterExtension 与 @ExtendWith 的注册顺序。

Java JUnit5 扩展模型 Extension 生命周期 TestWatcher 真实验证 动画演示
Java 内部原理 2026-10-04

JUnit 参数化测试

用 JUnit 5.11.3 真实运行参数化测试:@ValueSource、@CsvSource(引号、nullValues、空串)、@EnumSource、@MethodSource、@NullSource + @EmptySource 的调用次数与显示名;隐式 / 显式转换与聚合;参数数量不匹配与空来源的错误;每次调用都构造新实例并运行 BeforeEach / AfterEach,失败只影响自己。

Java JUnit5 参数化测试 ParameterizedTest CsvSource MethodSource 真实验证 动画演示
Java 内部原理 2026-10-04

JUnit 动态测试

用 JUnit 5.11.3 真实运行 @TestFactory:BeforeEach / AfterEach 只对工厂方法执行一次;失败的动态测试单独标记;DynamicContainer 嵌套;惰性 Stream 边产生边执行,onClose 在 AfterEach 之前;错误返回类型、工厂抛异常、空流;动态测试共享同一个实例。

Java JUnit5 动态测试 TestFactory DynamicTest DynamicContainer 真实验证 动画演示
Java 内部原理 2026-10-04

Java 属性测试

用 jqwik 1.9.1 真实运行属性测试:1000 次随机调用加边界值混入;溢出缺陷的平均值被找到并收缩成 (-1, -2147483648);第二次运行从 .jqwik-database 重放失败样本(tries = 1);Integer.MIN_VALUE 的 abs 缺陷;列表缺陷 11 个元素收缩成 [0, 0, 0, 0, 0, 0];Assume、穷举与统计。

Java jqwik 属性测试 收缩 随机测试 边界值 真实验证 动画演示
Java 内部原理 2026-10-04

Mutation Testing:测试是否真的能发现错误

用 PIT 1.17.2 对同一个类跑三套测试:弱测试集行覆盖率 86% 却只杀死 29 个变异里的 10 个(34%);断言具体值并测边界后 83%;调整测试数据与补一个断言后 90%,剩下 3 个存活的是等价变异。逐个变异器、逐行列出存活的变异。

Java 变异测试 PIT Pitest 测试质量 覆盖率 真实验证 动画演示
Java 内部原理 2026-10-04

Java API 兼容性检查

用 japicmp 0.23.1 比较库的两个版本,并用针对 1.0 编译的 15 个客户端在 2.0 上真实运行、再对 2.0 重新编译,逐项对照二进制 / 源码兼容性:10 个在 2.0 上运行失败(NoSuchMethodError、AbstractMethodError、IncompatibleClassChangeError、IllegalAccessError ……);I4、C14、C10 三处工具报告与实测不一致。

Java API兼容性 japicmp 二进制兼容 源码兼容 NoSuchMethodError 真实验证 动画演示
Java 内部原理 2026-10-04

Java 模块化测试

用 JUnit 5.11.3 在模块路径下测试一个 JPMS 模块:黑盒只能用导出的 API;去碰未导出的包编译期报 not visible、运行期 IllegalAccessError;白盒用 --patch-module 与 --add-reads,运行时还要 --add-opens 否则 4 个测试全部失败;同样的测试在类路径里毫无限制。

Java 模块 JPMS 测试 patch-module add-opens add-exports 真实验证 动画演示
Java 内部原理 2026-10-04

jdeprscan:提前发现已弃用 API

用 JDK 21 的 jdeprscan 扫描编译好的 jar:自己写的类里 9 种废弃 API 的使用点(--for-removal 只剩 5 条),--release 8 / 11 / 17 / 21 发现 2 / 6 / 7 / 10 条,废弃清单 471 → 681 条(for removal 10 → 103 条),并扫描 commons-lang 2.6、log4j 1.2.17、guava 18.0 里的 32 / 29 / 7 条。

Java jdeprscan 废弃API forRemoval JDK升级 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号