java动态代理字节码默认不落地,设置sun.misc.proxygenerator.savegeneratedfiles=true可强制保存至临时目录com/sun/proxy下,如$proxy0.class;仅适用于jdk原生proxy,jdk9+仍可用但属内部api。

Java 动态代理生成的代理类字节码默认不会落地到磁盘,但可以通过系统属性强制 JVM 保存。关键在于启用 sun.misc.ProxyGenerator.saveGeneratedFiles 开关,让 JDK 在运行时将生成的 .class 文件写入本地文件系统。
设置系统属性触发保存
在调用 Proxy.newProxyInstance(...) 之前,添加以下代码:
System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
注意必须放在 newProxyInstance 调用前,否则无效。该设置会令 JVM 将代理类字节码保存到临时目录(通常是 java.io.tmpdir),包路径为 com.sun.proxy,文件名形如 $Proxy0.class、$Proxy1.class 等。
通过 JVM 启动参数配置
更推荐的方式是在 IDE 或命令行中通过 VM options 设置,避免侵入业务代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- IntelliJ IDEA:打开 Run → Edit Configurations → VM Options,填入:
-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true - 命令行启动:
java -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true YourMainClass
此方式全局生效,且无需修改源码,适合调试多个代理场景。
定位并查看生成的 class 文件
生成的 .class 文件默认存放在系统临时目录下,可通过以下方式确认路径:
System.out.println(System.getProperty("java.io.tmpdir"));
进入该目录,查找 com/sun/proxy/ 子路径下的 .class 文件。用 IDEA 直接打开该文件,IDE 会自动反编译为可读的 Java 源码结构;也可用 javap -c 命令查看字节码指令。
注意事项与常见问题
该机制仅适用于 JDK 自带的 java.lang.reflect.Proxy,不适用于 CGLIB、Javassist 等第三方库。另外:
- JDK 9+ 中该属性仍可用,但属于内部 API,不保证长期兼容
- 若未看到文件,请检查是否设置了正确的类加载器,或是否存在安全策略限制文件写入
- 代理类继承
Proxy、实现目标接口,所有方法均委托给InvocationHandler.invoke(),反编译后可清晰看到这一转发逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










