使用Unsafe可以干一些好事。
Unsafe对象初始化
如果你的代码属于trusted的,可以直接使用下面的方式:
public static Unsafe getUnsafe() {
Class cc = sun.reflect.Reflection.getCallerClass(2);
if (cc.getClassLoader() != null)
throw new SecurityException("Unsafe");
return theUnsafe;
}
要使你的代码trusted,需要使用bootclasspath
java -Xbootclasspath:/usr/jdk1.7.0/jre/lib/rt.jar:. com.mishadoff.magic.UnsafeClient
但是这样显然是不爽的。
所幸可以用反射的方式获取:
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
有意思的用法
跳过初始化构造函数
内存修改
取得对象大小
直接浅复制
隐藏密码
多继承
动态增加类
Exception免检验
加速序列化
超大字符串
提高并发性能
参考
http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/