最近看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(NoSuchMethodException e) {

本文介绍了Objenesis库在Java中的作用,特别是它如何在不调用构造函数的情况下创建对象。针对Sun JVM,文章详细探讨了三种Instantiator实现:SunReflectionFactoryInstantiator、SunReflectionFactorySerializationInstantiator和UnsafeFactoryInstantiator。SunReflectionFactoryInstantiator通过反射工厂创建对象,而SunReflectionFactorySerializationInstantiator为兼容序列化做了额外处理。UnsafeFactoryInstantiator则利用Unsafe类的allocateInstance方法。性能测试结果显示,MungedConstructor速度最快,而UnsafeFactoryInstantiator最慢。
最低0.47元/天 解锁文章
5167

被折叠的 条评论
为什么被折叠?



