Java中多态是运行时机制,APT在编译期通过注解标记多态结构并生成免反射的代理调度代码,如CommandDispatcher.dispatch()或$AutoProxy_Command类,实现零开销、类型安全的静态多态代理。

Java 中多态本身是运行时机制,注解处理器(APT)则工作在编译期,二者不直接“配合”,但可以通过元数据驱动的方式,在编译期为多态结构生成**动态代理所需的支撑代码**——这类代码不是运行时动态创建的代理类,而是提前生成、类型安全、免反射的代理骨架或调度逻辑。关键在于:用注解标记多态体系,让 APT 提前“看懂”继承/实现关系,并生成可直接调用的代理入口。
用注解声明多态结构,供 APT 识别
纯 Java 语法无法表达“这个接口有哪些已知实现”,而注解可以补足这一层元信息:
- 在基类或接口上加 @Polymorphic 或 @ProxyTarget,表明它参与统一代理调度
- 在每个具体子类上标注 @Implementation(for = Command.class) 或 @HandlerFor("save"),显式声明其归属与语义角色
- APT 扫描后构建“类型-实现映射表”,避免运行时遍历 classpath 或依赖 Class.forName()
APT 生成免反射的代理调度代码
传统动态代理(如 Proxy.newProxyInstance)依赖运行时反射调用,而 APT 可在编译期生成硬编码的分发逻辑,替代反射:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 根据 @Implementation 注解,生成类似 CommandDispatcher.dispatch(String type) 的方法,内部用 switch-case 或 Map.of() 直接返回 new XxxCommand()
- 为泛型多态场景(如 Handler
)提取实际类型参数,生成专用工厂方法:EventHandlers.createSaveHandler() - 生成带完整类型检查的代理接口实现类(如 $AutoProxy_Command),它实现 Command 接口,内部转发给对应子类实例,不经过 Method.invoke
与 Jackson、Spring 等框架协同生成序列化/注入代理
多态常用于反序列化(如 JSON 中的 type 字段)或依赖注入,APT 可提前固化这些行为:
立即学习“Java免费学习笔记(深入)”;
- 扫描所有 @JsonPolymorphic 基类,自动生成 JacksonModule.registerSubtypes(...) 静态注册代码,或生成 @JsonSubTypes 注解值
- 结合 @Component 和 @ProxyFor,生成 Spring FactoryBean 或 Configuration 类,返回按策略选择的代理实例
- 若某子类漏标 @Implementation,APT 在编译期报错,而不是等到运行时反序列化失败才暴露问题
注意:这不是运行时动态代理,而是编译期代理代码生成
这里生成的不是 $Proxy0 这类 JVM 运行时字节码,而是普通 Java 源码(.java 文件),由 javac 正常编译。它本质是“静态生成的多态代理模板”,优势在于:
- 零反射开销,无 SecurityManager 限制,兼容 GraalVM Native Image
- IDE 可跳转、可调试、编译期类型检查完整
- 与 JDK 动态代理互补:APT 生成“确定分支”的代理逻辑;JDK Proxy 仍用于真正需要运行时任意类型适配的场景

















