我正在编写一个lib,我需要为某些对象创建代理。由于某些类没有实现任何接口,因此我决定使用CGLIB来创建代理而不是JDK代理。但是我遇到的情况是某些类没有默认构造函数而CGLIB无法为这些类型创建代理,即CGLIB抛出异常消息:Superclass没有null构造函数但没有给出参数。我如何解决这个问题,有没有办法在运行时使用cglib / asm或其他一些工具添加默认构造函数?谢谢。
答案 0 :(得分:3)
使用http://objenesis.org/。其中一个典型用例完全解决了您的问题:
代理,AOP库和模拟对象 - 可以对类进行子类化 无需担心super()构造函数。
答案 1 :(得分:2)
您认为表示为字节代码的内容无法完成,因为它会被JVM'验证程序拒绝。正如另一个答案所指出的,你应该考虑使用像Objenesis这样的库。但请注意,Objenesis使用JVM内部API,在引入项目Jigsaw时使用Java 9将无法再使用它。
出于这个原因,您可能更愿意以不同的方式处理此事。 Cglib只复制超类的所有构造函数。您想要调用任何您知道它是副作用的构造函数。只需为基元传递null
值或0
值即可。只要你拦截所有方法,对象状态无论如何都不重要,因为没有任何真正的方法被调用过。
答案 2 :(得分:2)
可能是下面来自objenesis的代码引用。
ReflectionFactory reflectionFactory = ReflectionFactory.getReflectionFactory();
Constructor<?> constructor = reflectionFactory.newConstructorForSerialization(YourClass.class, Object.class.getConstructor((Class[]) null));
Object instance = constructor.newInstance();
答案 3 :(得分:1)
我只是将评论中提供的the blog post解决方案复制并粘贴到另一个答案中以保留它。它结合了Objenesis和CGLIB,它确实有效。
n += row_totals(row_idx)