Gson sun.misc.Unsafe.allocateInstance序列化Java对象
最近使用Fastjson的时候遇到一个类无空构造方法导致无法反序列化类对象,试了下Fastjson和Jackson都无法创建,而Gson确可以无视构造方法反序列化对象。
测试类:TestRequest.java
public class TestRequest implements Serializable {
private String method;
private String queryString;
private String requestURI;
public TestRequest(HttpServletRequest request) {
this.method = request.getMethod();
this.queryString = request.getQueryString();
this.requestURI = request.getRequestURI();
}
.......省略get/set方法
}
跟了下Gson的序列化方式发现它封装了一个com.google.gson.internal.UnsafeAllocator类,见名知意,原来Gson使用sun.misc.Unsafe的allocateInstance方法来绕过了构造方法限制创建实例。熟悉Java安全的小伙伴儿应该都对sun.misc.Unsafe有所了解,Unsafe可以绕过很多JVM的限制,但如它名字一样这个类是不安全的,Unsafe大多数方法都是调用了JNI的native方法实现的。
而Fastjson和Jackson应该都是使用了Java的反射机制来创建类示例的,其中的Fastjson自作聪明的给无空构造方法的类都传递了一个null变量,在一定程度上还是能成功创建类实例,但是比较鸡肋,真是伤脑筋.