import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class Main {
private static Unsafe unsafe;
public Main() {
System.out.println("---构造函数---");
}
private String str = "初始化的字符串";
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
//css//第一种 new
Main newMain = new Main();
System.out.println("第一种 new");
System.out.println(newMain);
//css//第二种 反射
Main reflectMain = Main.class.newInstance();
System.out.println("第二种 反射");
System.out.println(reflectMain);
//css//第一种 使用黑科技,Unsafe(不用初始化字段和调用构造函数)
Main unsafeInstance = (Main) unsafe.allocateInstance(Main.class);
System.out.println("第一种 使用黑科技,Unsafe(不用初始化字段和调用构造函数)");
System.out.println(unsafeInstance.str);
System.out.println(unsafeInstance);
}
static {
// 由于只能在 主类加载器 加载的类下实例化,所里这里通过反射实例化Unsafe
Field f = null;
try {
f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
unsafe = (Unsafe) f.get(null);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return "Main{" +
"str='" + str + '\'' +
'}';
}
}
输出
---构造函数---
第一种 new
Main{str='123'}
---构造函数---
第二种 反射
Main{str='123'}
第一种 使用黑科技,Unsafe(不用初始化字段和调用构造函数)
null
Main{str='null'}