jdk 动态proxy持久化为.class文件方式草集

1,566 阅读1分钟

proxy动态代理持久化意义

jdk本身的动态代理技术得到了广泛的应用,如:mybatis mapper,spring cloud openFeign。那么我们在研究分析这个源码的时候,由于生成的动态代理类是在内存中的,致使我们无法看到.class的面目,增加了我们查看源码,分析原理,学习技术的难度。而对java和spring来说,都开了口子,通过设置环境变量来生成.class。

直接上配置方式

方式一:-D环境变量设置

## java动态代理持久化为.class文件配置方式
-Dsun.misc.ProxyGenerator.saveGeneratedFiles=true

## cglib动态代理持久化为.class文件配置方式
-Dcglib.debugLocation=/Users/xxx

通过idea配置的话,方式如下图

方式二:main方法配置

## java动态代理持久化为.class文件配置方式
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

## cglib动态代理持久化为.class文件配置方式
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/Users/xxx");

实践过程中,发现main方法配置方式中的java动态代理持久化为.class不起作用,原因还不明。

总结

个人觉得,通过-D环境变量设置更方便,无侵入性。如果你要看spring bootconstrollerservice等生成的代理class,因为他们是spring bootcglib方式生成的,所以配置上cglib动态代理;如果你要看@Mapper@FeignClient生成的代理class,因为他们是jdk方式生成的,所以配置上java动态代理

效果

配置好,启动项目后,动态代理持久化为.class文件会在项目目录下生成

我是spring boot项目,添加了spring-boot-actuator监控组件包,所以可以通过EndPoint功能查看刚配置的环境变量

$ curl -X GET 'http://localhost:8080/env'
{
    name: "systemProperties",
    properties: {
        ... ...
        sun.misc.ProxyGenerator.saveGeneratedFiles:{
            value: "true"
        }   
    }
}