I'm interested to know that, is it really possible to create an object reference for a java class without invoking any of it's constructors? If yes, how?
-
1No, it's not possible. Even when you create the instance via reflection, the default constructor is invoked. – Eran Sep 10 '14 at 20:15
-
`Object myObject = null;` --> IS this what you would be looking for? – Laf Sep 10 '14 at 20:16
-
It might be possible with `sun.misc.Unsafe`. But in "normal" Java, it's not possible. – August Sep 10 '14 at 20:16
-
"an object reference for a java class" - the object should refer to the `class` or to be an `instance` of the class ? – Nir Alfasi Sep 10 '14 at 20:18
-
1@Eran It is possible by using JNI. Check my answer for a reference. – maba Sep 10 '14 at 20:42
-
@Laf that's a `null` reference, it's not an object. – Luiggi Mendoza Sep 10 '14 at 20:55
-
Related: [what-are-all-the-different-ways-to-create-an-object-in-java](http://stackoverflow.com/questions/95419/what-are-all-the-different-ways-to-create-an-object-in-java) – Pshemo Jan 05 '15 at 15:32
4 Answers
Definitely a bad idea, but you could use the sun.misc.Unsafe
class to allocate an instance:
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);
}
Output:
0
1

- 12,410
- 3
- 35
- 51
It is possible by using JNI.
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html
Object Operations
AllocObject
jobject AllocObject(JNIEnv *env, jclass clazz);
Allocates a new Java object without invoking any of the constructors for the object. Returns a reference to the object.
The clazz argument must not refer to an array class.
It is hard to find any relevant usage of it. I would not use it but it is still an answer to the question.

- 47,113
- 10
- 108
- 118
The only way i can think of is using the clone()
method
Object objectA = objectB.clone();
Now objectA.clone() != objectA
and objectA
and objectB
point to two different places in memory so technically you create an object without calling its constructor.

- 2,618
- 2
- 15
- 29
Not possible. Every class has a default constructor that calls its parent constructor super() which boils down to Java's Object Class.

- 13,142
- 2
- 21
- 40
-
-
-
Can't create an object without calling some constructor either (default called implicitly) or your own created constructor called explicitly. – brso05 Sep 10 '14 at 20:20
-
Technically, it is possible, obviously not through reflection. Still there's no real need to create an object by not using a constructor. – Luiggi Mendoza Sep 10 '14 at 20:50