最近看kryo的源码发现使用了一个叫做objenesis的java库,主要是用在创建对象上面,它可以不用调用构造函数就创建对象。由于并不是所有的java类都有无参构造函数,并且有的类的构造函数还是private的,所以更甚有些类是第三方的,我们不能修改源码,所以这个库还是很有用的。http://objenesis.org/details.html
objenisis包含很多平台和jvm的实现,这里我们只关心sun的jvm中的Instantiator的实现。其中的实现大约有三种:
- SunReflectionFactoryInstantiator:使用sun.reflect.ReflectionFactory来创建对象
- SunReflectionFactorySerializationInstantiator:也是使用sun.reflect.ReflectionFactory来创建对象,但是为了兼容序列化,需要找到第一个没有实现serializable接口的父类,性能有一定的损耗。
- UnsafeFactoryInstantiator:使用sun.misc.Unsafe.allocateInstance来创建对象
还有一种MagicInstantiator看上去没什么用。
SunReflectionFactoryInstantiator
我们先来看看SunReflectionFactoryInstantiator的实现,代码非常短。
public SunReflectionFactoryInstantiator(Class<T> type) {
//获得object的对象
Constructor<Object> javaLangObjectConstructor = getJavaLangObjectConstructor();
//这个函数是关键,主要是为这个class创建了一个新的constractor
mungedConstructor = SunReflectionFactoryHelper.newConstructorForSerialization(
type, javaLangObjectConstructor);
mungedConstructor.setAccessible(true);
}
//创建对象,大家都看的懂
public T newInstance() {
try {
return mungedConstructor.newInstance((Object[]) null);
}
catch(Exception e) {
throw new ObjenesisException(e);
}
}
//获得object的对象
private static Constructor<Object> getJavaLangObjectConstructor() {
try {
return Object.class.getConstructor((Class[]) null);
}
catch</