如何不用构造函数创建对象? 有人说用反射,但是反射其实也是调用了构造函数。
这里我们介绍一种不常见的方案:用Unsafe
来实现生成新对象而不会调用构造函数
使用例子如下:
public class MyObject {
public int value;
public MyObject() {
value = 2;
System.out.println("构造函数创建对象...");
}
public static void main(String[] args) throws Exception {
// 获取 Unsafe 实例
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
// 使用 Unsafe 分配内存创建对象,绕过构造函数
MyObject obj = (MyObject) unsafe.allocateInstance(MyObject.class);
System.out.println("创建了对象: " + obj);
System.out.println("value= " + obj.value);
}
}
运行结果如下:
创建了对象: test.MyObject@5c8da962
value= 0
可以看到底层并没有经过构造函数,却直接分配对象的内存,并且我们却持有了这个对象。
相对常规的new对象的方式,这种使用unsafe的方式不是很常见
Unsafe.allocateInstance
的使用场景如下:
- 跳过构造方法
- 性能优化:在一些高性能框架中直接分配内存而跳过 Java 对象的标准初始化流程,可以减少 JVM 的一些开销,尤其在某些需要频繁创建大量对象的场景下。
- 内存管理控制:Unsafe 的一些方法允许直接操作内存,例如手动管理对象的引用等,框架可以通过 allocateInstance 控制更底层的内存分配和对象管理。