在 Java 17+ 的模块化(JPMS)环境下,使用 CGLIB 会遇到哪些挑战?如何解决非法反射访问问题?问题引入用户问题原文:在 Java 17+ 的模块化(JPMS)环境下,使用 CGLIB 会遇到哪些挑战?如何解决非法反射访问问题?随着 JDK 9 引入 Java Platform Module System (JPMS),Java 生态迎来了强封装(Strong Encapsulation)的新时代。这一变革旨在提升 JVM 的安全性和性能,但对 CGLIB 这类深度依赖内部 API 的字节码库构成了严峻挑战。当你将一个原本在 JDK 8 上运行良好的、基于 CGLIB 的金融交易 AOP 审计系统升级到 JDK 17 时,很可能会遭遇InaccessibleObjectException或IllegalAccessError等致命错误,导致整个应用无法启动。这些错误的核心在于,CGLIB 为了高效地生成和操作字节码,必须访问java.lang、sun.misc等核心模块中的非公共 API。在 JDK 8 及之前,这通过“非法反射访问”(illegal reflective access)是被允许的(尽管会有警告)。但从 JDK 16 开始,默认行为变为完全禁止此类访问。本文将深入剖析 CGLIB 在 JPMS 环境下面临