最近在学习java.util.concurrent包的内容时,发现了一个java中很强大的工具类Unsafe,不仅提供了很强大的功能,
如:
- 操纵对象属性
- 操纵数组元素
- 线程挂起与恢复、CAS
还发现了一些很“特殊”的用法。
public native Object allocateInstance(Class<?> var1) throws InstantiationException;
该方法可以通过Class对象构造一个对象实例。我们平时都是隐式(java反射)和显式地通过类的构造函数创建一个对象,而方法allocateInstance创建的对象实例并不会调用类的构造方法。示例结果如下:
示例代码如下:
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();
}
}