为java类创建对象引用而不调用它的构造函数

时间:2014-09-10 20:14:42

标签: java

我有兴趣知道,是否真的可以在不调用任何构造函数的情况下为java类创建对象引用?如果是,怎么样?

4 个答案:

答案 0 :(得分:3)

绝对不错,但您可以使用sun.misc.Unsafe类来分配实例:

public static class TestClass {
    int field = 1;
}

public static void main(String[] args) throws Exception {
    Constructor<Unsafe> constructor = Unsafe.class.getDeclaredConstructor();
    constructor.setAccessible(true);
    Unsafe unsafe = constructor.newInstance();

    TestClass test = (TestClass) unsafe.allocateInstance(TestClass.class);
    System.out.println(test.field);
    System.out.println(new TestClass().field);
}

输出:

0
1

答案 1 :(得分:2)

可以使用JNI。

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

对象操作

AllocObject

jobject AllocObject(JNIEnv *env, jclass clazz);
  

分配新的Java对象,而不调用该对象的任何构造函数。返回对象的引用。

     

clazz参数不能引用数组类。


很难找到它的任何相关用法。我不会用它,但它仍然是这个问题的答案。

答案 2 :(得分:1)

我能想到的唯一方法是使用clone()方法

Object objectA = objectB.clone();

现在objectA.clone() != objectAobjectA以及objectB指向内存中的两个不同位置,因此从技术上讲,您无需调用其构造函数即可创建对象。

答案 3 :(得分:0)

不可能。每个类都有一个默认的构造函数,它调用它的父构造函数super(),它归结为Java的Object类。