有如下类定义,请不用关注类的实际意义:
public class Person {
static final int DEFAULT_SEX = 1;
public static int sex = DEFAULT_SEX;
public String name = "default";
static {
System.out.println("------person initialed------");
}
private Person(String name) {
super();
this.name = name;
}
@Override
public String toString() {
return "Person [name=" + name + ",sex=" + sex + "]";
}
}
从反射角度,最初我们会写这样的代码:
public static void main(String[] args) throws Exception {
Constructor<Person> constructor = Person.class.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Person p = constructor.newInstance("guor");
System.out.println(p);
}
输出:
------person initialed------
Person [name=guor,sex=1]
使用反射机制的情况,基本上对类定义比较敏感,一旦类构造函数发生改变,上面的代码很有可能发生运行时错误。
今天了解sun.misc.Unsafe的时候,发现如下另外一种写法,可谓是万能的初始化:
@SuppressWarnings("restriction")
public static sun.misc.Unsafe getUnsafe() throws Exception {
Field f = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (sun.misc.Unsafe) f.get(null);
}
@SuppressWarnings({ "restriction" })
public static void main(String[] args) throws Exception {
sun.misc.Unsafe unsafe = getUnsafe();
Person p = (Person) unsafe.allocateInstance(Person.class);
System.out.println(p);
}
输出:
------person initialed------
Person [name=null,sex=1]
需要注意的是,第二种初始化的方式,对象的成员变量并不会被初始化