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

Security Provider:Java 加密算法如何找到实现

验证 Java 加密提供者机制:JDK 21 安装了 13 个提供者(SUN、SunRsaSign、SunEC、SunJCE…),getInstance 按顺序选第一个有该算法的;别名、OID 与大小写;各种 NoSuchAlgorithm/NoSuchProvider 错误;Cipher.getInstance("AES") 默认 ECB;自定义提供者 insertProviderAt(…, 1) 接管 SHA-256,构造器非 public 时被静默跳过。

Java Security Provider JCA 加密 真实验证 动画演示
Java 内部原理 2026-10-03

KeyStore:管理密钥与证书的容器边界

验证 KeyStore:JDK 21 默认 pkcs12,PKCS12 文件头 308203da 与 JKS 的 feedfeed 可自动识别;两种格式密码错误的信息;JKS 私钥有独立密码、不能存对称密钥,PKCS12 可以;TrustedCertificateEntry;JDK 自带 cacerts 有 111 个受信任根证书。

Java KeyStore PKCS12 JKS cacerts 真实验证 动画演示
Java 内部原理 2026-10-03

Unicode 与 Charset:字符、代码点和字节不要混为一谈

Java 里字符、码点、字素、字节是四件事:😀 length 为 2,家庭 emoji length 8 却只有 1 个字素;错误解码得到乱码、损坏字节被替换成 U+FFFD;JDK 17 默认字符集跟随系统而 JDK 21 固定 UTF-8;规范化与 toUpperCase 的长度变化、土耳其语 i。

Java Unicode Charset 字符集 Normalizer 真实验证 动画演示
Java 内部原理 2026-10-03

Collator:按语言规则比较文本

用 java.text.Collator 做按语言规则的排序:String 自然顺序把 Äpfel、éclair 排到最后,Collator 不会;strength 决定什么算相等;Locale.CHINA 的汉字排序与拼音一致;20000 个字符串排序 compare 97 ms、CollationKey 23 ms、自然顺序 4 ms。

Java Collator 排序 本地化 真实验证 动画演示
Java 内部原理 2026-10-03

Java XML 与 XXE:解析器安全开关要成套设置

在自己的测试 XML 与本地服务上验证 JAXP:JDK 21 默认的 DOM、SAX、StAX、Transformer 都会解析本地文件实体,DOM 还会请求远程 DTD;各种安全开关里有的拒绝(抛错)、有的悄悄忽略;嵌套实体默认被 64000 次展开限制挡住,关闭 secure processing 后 10^6 级别的展开耗时 755 ms。

Java XML XXE JAXP 安全 真实验证 动画演示
Java 内部原理 2026-10-03

Java Compiler API:在程序里编译源代码

用 javax.tools 在程序里编译源码:内存编译首次 150 ms、预热后约 8 ms;诊断带行列号与诊断码;-Xlint 与 -Werror;--release 同时限制语法与 API;jlink 出的运行时缺 jdk.compiler 时 getSystemJavaCompiler() 为 null。

Java Compiler API javax.tools jlink 真实验证 动画演示
Java 内部原理 2026-10-03

Tree API:用语法树理解 Java 源码

用 com.sun.source 的 Tree API 分析一段 24 行的 Java 源码:184 个语法树节点、圈复杂度、方法调用及源码位置;parse() 只报语法错误,analyze() 之后才有类型信息与语义错误;24 行代码 parse 2.4 ms、analyze 22.8 ms。

Java Tree API 编译器 语法树 真实验证 动画演示
Java 内部原理 2026-10-03

Doclet:从 Javadoc 模型生成自定义文档

写一个只有几十行的自定义 doclet 遍历 shop 包:12 个成员、5 个没文档注释;-private、自定义选项与错误选项;标准 doclet 生成 36 个文件并被 -Xdoclint 报 9 条警告;注释继承在标准 doclet 里自动展开、自己的 doclet 要自己处理。

Java javadoc Doclet 文档 真实验证 动画演示
Java 内部原理 2026-10-03

Java Logging Pipeline:从日志调用到输出端

验证 java.util.logging:logger 级别与 handler 级别两道关、父链传播;被过滤的 fine 调用拼接 21.9 ns、Supplier 0.6 ns;FileHandler 的 limit/count 轮转;没有强引用的 logger 在 GC 后级别丢失;System.Logger 默认包装 JUL。

Java 日志 java.util.logging System.Logger 真实验证 动画演示
Java 内部原理 2026-10-03

Java Compression:压缩流、缓冲区和数据边界

验证 java.util.zip:zlib、raw deflate、gzip 的头尾分别 6 与 18 字节;level 9 比 6 小约 5%、耗时约 5 倍;随机数据压不动;截断、损坏、拼接与垃圾字节的异常;256 MiB 全零只有 254 KiB 的解压炸弹;syncFlush。

Java 压缩 GZIP Deflater 解压炸弹 真实验证 动画演示
Java 内部原理 2026-10-03

桥接方法:泛型重写背后的隐藏方法

用 javap 与反射看 javac 生成的桥接方法:Box 里源码写了 3 个方法,class 文件里多出 3 个 ACC_BRIDGE|ACC_SYNTHETIC 方法;桥接方法只做 checkcast 后转调真实方法,注解会被复制,栈帧行号指向类声明行;包私有父类的 public 方法还会有可见性桥接。

Java 桥接方法 泛型 javap 反射 真实验证 动画演示
Java 内部原理 2026-10-03

Record 序列化:紧凑数据类的兼容边界

验证 record 的序列化:反序列化调用 canonical 构造器,因此构造器里的校验不会被篡改的流绕过(普通类会读出 age=-5,record 抛 InvalidObjectException);增加/删除/改名组件兼容,改类型不兼容;serialVersionUID 不参与比较;writeObject/readObject 被忽略,writeReplace/readResolve 有效。

Java 序列化 Record InvalidObjectException 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号