在很多系统里,我们都想做一件看似简单、却总是绕不开工程细节的事:在不改动原始业务类的前提下,为某个方法统一加上前置与后置逻辑,例如日志、鉴权、埋点、缓存、限流、异常兜底,甚至把一次调用的输入输出喂给 AI 做质量检测。
如果只追求会跑,动态代理并不难:Java 侧可以用 JDK 动态代理或 CGLIB,ABAP 侧也能用各种动态技术做包装。但一旦你希望这个代理类不仅在当前会话有效,还能被持久化(例如落到磁盘、落到 ABAP Repository 里),让后续会话、其他工具、甚至运维同事都能直接看到它、调试它、复用它,事情就变得更有意思了。
这篇文章把思路拆开来讲:Java 里把代理类源码动态生成、写入磁盘、编译成 class、再加载成可实例化的 Class;ABAP 里把代理类源码与元数据动态拼装,并通过 ABAP 的类生成机制生成一个全局类。整体实现基于 Proxy 设计模式。
为什么要做可持久化的动态代理
很多同学第一次接触代理,停留在AOP或拦截器的层面:执行前做点事,执行后做点事。那为什么还要折腾持久化?
这里有几个很真实的场景:
- 可观测性与审计要可追溯:线上问题复盘时,你希望直接拿到当时实际执行的代理代码,而不是只看一段框架配置。
- 调试体验:持久化之后,IDE、调试器、代码搜索、静态检查都能直接工作。Java 里 class 文件落盘;ABAP 里能在 SE