生成动态代理类文件

前言

刚开始知道动态代理的时候,总是觉得这些东西很神奇,神奇的感觉通常源于未知。这里介绍两个可以将生成的动态代理类写入硬盘生成文件的方法,方便一睹动态代理类的真容。

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 类,这显然是不能编译通过的。

原文地址:https://www.cnblogs.com/lwmp/p/13940996.html