欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中Unsafe类的“特殊”用法

程序员文章站 2022-06-19 19:28:42
...

最近在学习java.util.concurrent包的内容时,发现了一个java中很强大的工具类Unsafe,不仅提供了很强大的功能,

如:

  • 操纵对象属性
  • 操纵数组元素
  • 线程挂起与恢复、CAS

还发现了一些很“特殊”的用法。

public native Object allocateInstance(Class<?> var1) throws InstantiationException;

该方法可以通过Class对象构造一个对象实例。我们平时都是隐式(java反射)和显式地通过类的构造函数创建一个对象,而方法allocateInstance创建的对象实例并不会调用类的构造方法。示例结果如下:

java中Unsafe类的“特殊”用法

示例代码如下:

public class UnsafeTest {
    static class Test {
        Test() {
            System.out.println("born in construction");
        }

        void surprise() {
            System.out.println("surprise: without construction, i was born");
        }
    }

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
        Field field = Unsafe.class.getDeclaredField("theUnsafe");
        field.setAccessible(true);
        Unsafe unsafe = (Unsafe) field.get(null);
        Test test = (Test) unsafe.allocateInstance(Test.class);
        test.surprise();
    }
}