在Java中,是否可能创建一个对象的实例而不调用构造函数?

22

我正在尝试修复一个程序中的错误,我认为这个错误可能是由于Hibernate找到了如何实例化一个对象而没有调用其默认(或任何其他)构造函数。


3
你可能应该发布原始问题而不是所谓的解决方案。 - Daniel Bleisteiner
2
Hibernate使用实体的默认空构造函数。你走错了方向。请发布你的问题。 - Pascal Thivent
4个回答

32

实际上,如果您使用Objenesis来为您实例化对象,那么在实例化对象时是可以绕过构造函数的。它会进行字节码操作以实现这一点。

反序列化对象也将绕过构造函数。

使用反射无法实现此操作。


10
为了完整说明:使用方法clone创建新对象也会绕过构造函数。

1
只要clone()被正确实现,就可以覆盖它以充当工厂方法,而不使用super.clone()。(虽然应该使用super.clone()而不是构造函数) - DerMike

7

是的,反序列化一个对象不会调用它的构造函数。

话虽如此,我不明白为什么Hibernate会对一个对象进行序列化,除非是在二级缓存中。


7
反序列化涉及创建对象而不调用构造函数。
通过编程方式实现这一点是可能的(至少使用Sun/Oracle JDK)。这在"不调用构造函数创建对象", Java专家新闻通讯 的一期中有所介绍。它涉及使用sun.*包中的类,因此不可移植。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接