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

编译器插件:把额外检查接入 Java 构建

写一个 javac 插件(com.sun.source.util.Plugin)检查 System.out.println 并接入真实构建:-Xplugin 的警告与错误(返回码 0 与 1)、插件参数、编译阶段事件顺序、带与不带插件 248 与 233 ms、在 Maven 的 compilerArgs 里接入(fork 为 true 与 false 都有效)。

Java javac插件 Plugin TaskListener Maven 真实验证 动画演示
Java 内部原理 2026-10-03

Javadoc 自定义标签:让 API 文档表达团队约定

真实运行 javadoc 的自定义标签:JDK 21 默认对 @apiNote、@implSpec 与团队自定义标签报 unknown tag(6 条错误,返回码 1);-tag 的位置字符 a/m/t/X 的效果;写一个 Taglet 用代码决定输出;自定义标签定义好后 -Xdoclint:all 不再拒绝。

Java javadoc 自定义标签 Taglet -tag 真实验证 动画演示
Java 内部原理 2026-10-03

Classpath 与 Module Path:依赖可见性为什么会变化

同一个 jar 放在 classpath 与 module path 上的可见性差异:编译期 package is not visible、运行期 IllegalAccessException 与 InaccessibleObjectException、--add-exports 与 --add-opens 的区别;自动模块的命名;split package 在两种路径上的不同后果(含 NoClassDefFoundError);JDK 17 与 21 对内部 API 的封装。

Java classpath module path 模块 自动模块 封装 真实验证 动画演示
Java 内部原理 2026-10-03

Java 启动优化:把冷启动时间拆成可测阶段

把 Jackson + HttpServer 小程序的冷启动拆成可测阶段:到首次请求 192 ms,JVM 到 main 只有 17.0 ms,main 里初始化 140.0 ms;逐个试启动选项:AppCDS 把到 READY 从 173 降到 102 ms,只用 C1 155 ms,SerialGC 与 -UsePerfData 没有变化;类加载与 main 内的耗时分解。

Java 启动优化 冷启动 AppCDS 类加载 真实验证 动画演示
Java 内部原理 2026-10-03

var 的类型推断边界

用 javac 的错误信息读出 var 推断出的类型(25 个例子:钻石变 ArrayList<Object>、交集类型、捕获类型、匿名类),列出 var 不能用的位置的 9 种编译错误,验证 var 与显式类型的 class 文件完全相同,以及钻石、重载、静态类型与 int 溢出的陷阱。

Java var 局部变量类型推断 类型系统 真实验证 动画演示
Java 内部原理 2026-10-03

Switch 守卫条件与复杂模式

逐项验证 Java 21 switch 的守卫与复杂模式:支配与穷尽规则、绑定变量在守卫里的限制、嵌套 record 与泛型 sealed 的穷尽性、限定枚举常量;运行期守卫求值与 MatchException;模式 switch 89 ms 对 instanceof 链 34 ms;发现 javac 对守卫里的受检异常不报错。

Java switch when守卫 record模式 sealed 真实验证 动画演示
Java 内部原理 2026-10-03

原始类型模式匹配

用同样的 8 段代码在 JDK 21、JDK 27、JDK 27 加预览三种环境下验证原始类型模式:JDK 21 全部编译失败,JDK 27 要加 --enable-preview 才能用;instanceof 作为「能否精确转换」的测试(int→byte、int→float、double→float、int→char 的边界);switch 可以用 long、boolean、double。

Java 原始类型模式 instanceof switch 预览特性 真实验证 动画演示
Java 内部原理 2026-10-03

未命名变量与未命名模式

在 JDK 21(无预览、加预览)与 JDK 27 上真实验证未命名变量与模式 _:catch、for、try-with-resources、lambda、record 模式里的 _,case A _, B _ 的合并分支;JDK 21 不加预览全部失败;未命名变量不进局部变量表;_ 自 Java 9 起是关键字。

Java 未命名变量 未命名模式 下划线 预览特性 真实验证 动画演示
Java 内部原理 2026-10-03

隐式声明类与实例 main

在 JDK 21(无预览、加预览)与 JDK 27 上真实验证 main 的新形态:static 无参、实例 main、继承的 main、顶层方法与字段;两个版本里 static 无参与实例 main(String[]) 的选择顺序不同;JDK 27 有隐式 import 与 IO.println;编译出 final class Hello 与 void main()。

Java 隐式声明类 实例main 紧凑源文件 预览特性 真实验证 动画演示
Java 内部原理 2026-10-03

字符串模板设计

在 JDK 21(无预览、加预览)与 JDK 27 上真实编译字符串模板:只有 JDK 21 加预览能通过(STR、FMT、RAW、自定义处理器),JDK 27 报 illegal escape character;STR 简单模板编成 invokedynamic 拼接;自写处理器可把值参数化;不用模板的替代写法。

Java 字符串模板 STR StringTemplate 预览特性 真实验证 动画演示
Java 内部原理 2026-10-03

enum 的初始化顺序

真实运行验证枚举的初始化:常量先于 static 块、构造器读静态字段的编译限制、哪些访问触发初始化、javap 看 $VALUES 与 values() 的 clone、反射不能创建枚举、初始化失败后 NoClassDefFoundError、两个枚举的循环引用。

Java 枚举 类初始化 clinit values 反射 真实验证 动画演示
Java 内部原理 2026-10-03

接口默认方法冲突

真实编译验证接口默认方法冲突:两个无关默认方法必须覆盖;抽象不让位;更具体的接口胜出;类优先;X.super 只能指直接父接口;单独编译后新增 default 导致运行时 IncompatibleClassChangeError;字节码用 invokespecial InterfaceMethod。

Java 默认方法 接口 菱形继承 二进制兼容 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号