我想为一个类而不是一个接口创建一个代理。有一些答案描述了为此目的使用cglib或Javassist(例如https://stackoverflow.com/a/4449998/),但我遇到了一个问题,因为我对代理感兴趣的类没有无参数构造函数,因此Enhancer.create()
抛出异常。看看Javassist ProxyFactory
javadoc,它也需要构造函数参数。
显而易见的解决方法是通过反射找到构造函数参数类型,并传递一个null/0/等数组。但如果构造函数抛出异常,这将不起作用。
是否有更好的选择(也许使用其他库)?
您可以使用Objenesis,它被实现为几个JVM特定类的包装器。因此,此库允许您创建类的实例,而无需调用其任何构造函数。然而,使用Objenesis可能是不安全的,因为jvm特定的类是不可移植或标准化的。由于这个原因,像Spring或Hibernate这样的库更需要一个无参数的构造函数。
无耻的插件:如果您通常在寻找javassist/cglib的替代方案,那么请查看我的库bytebuddy.net。