2019-01-31 23:43:27

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变量,在一定程度上还是能成功创建类实例,但是比较鸡肋,真是伤脑筋.



发表回复