一、查看生成的代理
默认生成的代理类的class文件是不会持久化落盘的,所以你想通过javap、JD-GUI这些工具查看字节码或反编译是看不到的。你需要在动态代理运行的JVM的进程中设置一个环境变量,让其落盘持久化。
- JDK8及以前:
/* 设置此系统属性,让JVM生成的Proxy类写入文件。保存路径为:项目文件系统目录下com/sun/proxy文件夹中 */
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
- JDK8以后:
// 生成的代理类字节码自动保存在:项目文件系统目录下com\sun\proxy\jdk\proxy1文件夹中
System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");
question:
- 该系统属性从哪里来?
- 该系统属性有什么用?
1.从哪里来
源码揭露一切:
这里主要是看ProxyBuilder.build()方法:
注意generateProxyClass()函数中的if,前面已经通过ProxyGenerator.generateClassFile()生成代理类字节码的比特流,不过还存在内存中,是一个byte[]数组。如果系统属性saveGeneratedFiles为真,那么就保存磁盘。