前言
刚开始知道动态代理的时候,总是觉得这些东西很神奇,神奇的感觉通常源于未知。这里介绍两个可以将生成的动态代理类写入硬盘生成文件的方法,方便一睹动态代理类的真容。
jdk 动态代理
在main方法中加入如下代码即可:
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
会在项目的根目录下生成文件夹:com.sun.proxy
有的同学加入了这个配置,有可能还是没有生成动态代理类文件。这个时候需要你打开 sun.misc.ProxyGenerator 这个类,找到 saveGeneratedFiles 这个属性,看看他取的是哪个系统属性。
private static final boolean saveGeneratedFiles = (Boolean)AccessController.doPrivileged(new GetBooleanAction("sun.misc.ProxyGenerator.saveGeneratedFiles"));
cglib 动态代理
在main方法中加入如下代码:
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E:\project\test\cglib");
还有人提的一种方法:
public static void main(String[] args) {
byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{ISubject.class});
try {
FileOutputStream fileOutputStream = new FileOutputStream("E:\project\test\manual_proxy\$Proxy0.class");
fileOutputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
这个其实就是jdk动态代理生成代理类文件调用的方法,需要注意的是 generateProxyClass() 方法的第二个参数需要是接口,不然你就会发现生成的代理类文件中会出现 $proxy implements 类,这显然是不能编译通过的。