Java不用构造函数如何创建对象?

如何不用构造函数创建对象? 有人说用反射,但是反射其实也是调用了构造函数。

这里我们介绍一种不常见的方案:用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 控制更底层的内存分配和对象管理。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值