【问题标题】:Is it possible to instantiate a class without calling any constructor? [duplicate]是否可以在不调用任何构造函数的情况下实例化一个类? [复制]
【发布时间】:2020-09-17 04:34:06
【问题描述】:

我正在尝试对一些 java 对象进行序列化。为此,我想实例化(对我而言)未知类,这些类可能没有默认构造函数。由于我不知道应该如何调用其他构造函数(我可以知道参数,是的,但这不是很有帮助),我只想创建一个类的“空白”实例。

之后我会使用反射来设置它的属性。

这有可能吗?

【问题讨论】:

  • 正如@SotiriosDelimanolis 所说,这是不可能的。这部分是为了允许类作者控制如何实例化他们的类的实例,例如在创建单例对象时,经常会在类上使用私有构造函数。
  • 你想反序列化什么样的对象?
  • 也是通过序列化完成的。
  • 谢谢@SotiriosDelimanolis,我会用objenesis试试

标签: java serialization reflection


【解决方案1】:

可以使用 Unsafe 类。此外,还有可能使用这个 sun.x 类获得“constructorForSerialization”:

ReflectionFactory.getReflectionFactory().
    newConstructorForSerialization(clazz, c);

【讨论】:

    【解决方案2】:

    简而言之,不。

    但是,您可以通过多种方式调用构造函数。它可能是“默认”构造函数,也可能是代码中没有实际表达的构造函数,或者是在执行其他项目(如反序列化)时内部的构造函数。

    构造函数返回一个引用,它由几个重要的内部步骤组成。

    1. JVM 需要在堆上分配内存来保存类的成员数据(以及对支持项的引用)。
    2. 该内部 JVM 数据结构的地址被赋予了类型安全的引用。
    3. 调用了适当的<init>(...) 方法(从编程的角度来看,这就是人们认为的构造方法,通常写成public Object(...) { ... })。
    4. 引用返回到执行上下文。

    所以构造不仅仅是你调用的代码,它是对象创建的实现。您可以通过各种方式避免提供init 方法,但构造所需的内部操作并不是真正可以跳过的。如果是,那么您将缺少对象引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 2011-11-23
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多