如何在不调用任何构造函数的代码的情况下创建类的实例?

时间:2015-06-28 18:22:06

标签: java

这是一个自我回答的问题,旨在分享http://java.dzone.com/articles/understanding-sunmiscunsafe

的一些知识

我正在使用Oracle HotSpot Java虚拟机。

假设我有一个类A并且我想创建这个类的实例而不调用它的构造函数(假设构造函数是私有的,昂贵的,或者只是做我想要避免的事情)。

例如,如何创建此类的实例

class A{
    private A(){
        System.exit(0);//or any task I want to avoid
    }
}

没有让我的申请退出?有可能吗?

3 个答案:

答案 0 :(得分:3)

以下是:

Field theUnsafe = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
sun.misc.Unsafe unsafe = (sun.misc.Unsafe) theUnsafe.get(null);
A instance = (A)unsafe.allocateInstance(A.class);
System.out.println("done!");

建议不要使用sun包中的类。这并不意味着你不能,所以要注意它。

答案 1 :(得分:2)

除了调用构造函数之外,没有办法做到这一点。即使使用反射,它也会在后台调用构造函数。如果有办法,像单身模式这样的模式将不起作用。

答案 2 :(得分:1)

  

如何在不使用构造函数的情况下创建实例?

你没有。必须>构造函数才能在Java中创建实例。但是你可以使用构建器或工厂方法来调用它。

// Factory method.
public static A makeIt() {
    return new A();
}