Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以在不调用任何构造函数的情况下实例化类?_Java_Serialization_Reflection - Fatal编程技术网

Java 是否可以在不调用任何构造函数的情况下实例化类?

Java 是否可以在不调用任何构造函数的情况下实例化类?,java,serialization,reflection,Java,Serialization,Reflection,我正在尝试对一些java对象进行序列化。为此,我想(对我)实例化未知类,这些类可能没有默认构造函数。由于我不知道应该如何调用其他构造函数(我可以知道参数,是的,但这不是很有帮助),我只想创建一个类的“空白”实例 之后,我将使用反射来设置它的属性 这有可能吗?简言之,没有 但是,可以通过多种方式调用构造函数。它可能是一个“默认”构造函数,或者不是在代码中实际表达的构造函数,或者在执行其他项(如反序列化)时是内部的构造函数 构造函数返回一个引用,该引用由几个重要的内部步骤组成 JVM需要在堆上分配内

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

之后,我将使用反射来设置它的属性

这有可能吗?

简言之,没有

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

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

  • JVM需要在堆上分配内存来保存类的成员数据(以及对支持项的引用)
  • 该内部JVM数据结构的地址提供了一个类型安全引用
  • 调用相应的
    (…)
    方法(从编程的角度来看,这就是人们认为的构造函数方法,通常是编写
    公共对象(…){…}
  • 引用将返回到执行上下文

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

    使用不安全类是可能的。此外,还可以使用此sun.x类获得“constructorForSerialization”:

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

    正如@SotiriosDelimanolis所说,这是不可能的。这在一定程度上是为了让类作者控制如何实例化其类的实例,例如,在创建单例对象时,在类上经常使用私有构造函数。您试图反序列化什么类型的对象?它也通过序列化完成。谢谢@SotiriosDelimanolis,我将尝试使用objenesis