这是一个自我回答的问题,旨在分享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
}
}
没有让我的申请退出?有可能吗?
答案 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();
}