Gson sun.misc.Unsafe.allocateInstance序列化Java对象
最近使用Fastjson的时候遇到一个类无空构造方法导致无法反序列化类对象,试了下Fastjson和Jackson都无法创建,而Gson确可以无视构造方法反序列化对象。
测试类:TestRequest.java
java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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变量,在一定程度上还是能成功创建类实例,但是比较鸡肋,真是伤脑筋.
学习了