为没有无参数构造函数的类创建动态代理

时间:2014-05-23 10:52:45

标签: java reflection proxy-classes javassist cglib

我想为类而不是接口创建代理。有些答案描述了为此目的使用cglib或Javassist(例如https://stackoverflow.com/a/4449998/),但我遇到了皱纹,因为我对代理感兴趣的类没有无参数构造函数,所以Enhancer.create()抛出异常。看看Javassist ProxyFactory javadoc,它也需要构造函数参数。

明显的解决方法是通过反射查找构造函数参数类型并传递nulls / 0 / etc数组。但如果构造函数抛出异常,这将无法工作。

是否有更好的选择(也许使用其他库)?

1 个答案:

答案 0 :(得分:4)

您可以使用Objenesis作为几个JVM特定类的包装器实现。因此,此库允许您创建类的实例,而无需调用其任何构造函数。但是,使用Objenesis可能不安全,因为JVM特定的类不可移植或标准化。因此,像Spring或Hibernate这样的库需要一个无参构造函数。

无耻插件:如果您一般都在寻找仍在积极开发的javassist / cglib的替代方案,请查看我的库bytebuddy.net