在运行时在java类中添加默认构造函数

时间:2014-12-04 19:49:27

标签: java proxy cglib

我正在编写一个lib,我需要为某些对象创建代理。由于某些类没有实现任何接口,因此我决定使用CGLIB来创建代理而不是JDK代理。但是我遇到的情况是某些类没有默认构造函数而CGLIB无法为这些类型创建代理,即CGLIB抛出异常消息:Superclass没有null构造函数但没有给出参数。我如何解决这个问题,有没有办法在运行时使用cglib / asm或其他一些工具添加默认构造函数?谢谢。

4 个答案:

答案 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)