用 PIT 1.17.2 对同一个类跑三套测试:弱测试集行覆盖率 86% 却只杀死 29 个变异里的 10 个(34%);断言具体值并测边界后 83%;调整测试数据与补一个断言后 90%,剩下 3 个存活的是等价变异。逐个变异器、逐行列出存活的变异。
用 japicmp 0.23.1 比较库的两个版本,并用针对 1.0 编译的 15 个客户端在 2.0 上真实运行、再对 2.0 重新编译,逐项对照二进制 / 源码兼容性:10 个在 2.0 上运行失败(NoSuchMethodError、AbstractMethodError、IncompatibleClassChangeError、IllegalAccessError ……);I4、C14、C10 三处工具报告与实测不一致。
用 JUnit 5.11.3 在模块路径下测试一个 JPMS 模块:黑盒只能用导出的 API;去碰未导出的包编译期报 not visible、运行期 IllegalAccessError;白盒用 --patch-module 与 --add-reads,运行时还要 --add-opens 否则 4 个测试全部失败;同样的测试在类路径里毫无限制。
用 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 条。
用 mvn dependency:tree 解析 6 个直接依赖(13 个构件),再用 OSV 的 querybatch 在 2.7 秒内查出 11 个构件共 92 条已知漏洞记录(jackson-databind 2.9.8 一个就有 59 条);传递依赖里有 5 个构件带漏洞;各漏洞的 CVE、严重程度、修复版本;同一个库不同版本的记录数对比。
用 Maven 3.9 与 maven-build-cache-extension 1.2.0 在一个 8 个类加 1.5 秒测试的小项目上实测:增量编译在没改东西时不重新编译但仍跑测试(2.8 秒),改一个文件会重新编译整个模块的 8 个源文件;构建缓存命中后 clean verify 只要 1.2 秒(跳过编译、测试、打包 6 个插件执行),源文件改动后未命中 3.3 秒。
在 JDK 21 上逐个运行 MethodHandle 的组合器:insertArguments、dropArguments、filterArguments、filterReturnValue、permuteArguments、foldArguments、collectArguments、asSpreader、guardWithTest、catchException、tryFinally、countedLoop、asType、asVarargsCollector 的类型与结果,以及常见的类型错误;static final 句柄与直接调用一样快(0.58 ns),局部句柄 2.26 ns。
在 JDK 21 上验证 lambda 的实现:javac 把 lambda 体编成合成方法、使用处是 invokedynamic 加 LambdaMetafactory;非捕获 lambda 是单例、捕获的每次新建;第一个 lambda 链接 3.03 ms(-Xshare:off 时 6.42 ms);手动调用 metafactory 得到同类的隐藏类且调用耗时相同;可序列化 lambda 通过 altMetafactory 与 SerializedLambda。
在 JDK 21 上验证 ClassValue:每个 Class 一份缓存、computeValue 并发时被调用 8 次但只保留一个结果、取值 2.24 ns 比 ConcurrentHashMap 的 3.10 ns 更快;用自定义类加载器验证——static ConcurrentHashMap 与「值引用 key 的 WeakHashMap」会泄漏类加载器,ClassValue 即使值持有 Class 本身也不泄漏。
在 JDK 21 上对比同一份嵌套类源码 --release 21 与 --release 8 的编译结果:release 21 没有 access$ 桥接方法、有 NestHost / NestMembers 属性,类文件更少更小(3 个 2440 字节对 4 个 2696 字节);getNestHost / getNestMembers / isNestmateOf;反射读私有字段的限制;嵌套关系不一致时的 IllegalAccessError 与旧方式的 NoSuchMethodError。
在 JDK 21 上验证 assert:字节码里的 $assertionsDisabled 与 desiredAssertionStatus;-ea / -da / -esa 对不同包的作用;断言关闭时表达式不被求值;断言状态在类初始化时固定,之后再改无效;一个昂贵的断言开启后每次迭代 10.51 ns,关闭时 0.58 ns。
用真实的分别编译验证枚举 switch 的兼容性:javac 生成 Client$1 与 $SwitchMap$Color(按名字映射,每个常量 try/catch NoSuchFieldError);库新增、重排、删除、重命名枚举常量时,不重新编译的客户端各种 switch 写法的行为:新增常量走 default 或抛 MatchException,删除常量不失败,直接用 ordinal() 会出错。