动态得到类的实例,我们通常通过反射来得到。但有时候,类缺少默认构造方法,我们又不想传参来实例化,这时候怎么办呢?
我们还可以通过sun.reflect.ReflectionFactory来完成,例子如下:
import java.lang.reflect.Constructor;
import java.util.concurrent.ConcurrentHashMap;
import sun.reflect.ReflectionFactory;
import com.esotericsoftware.kryo.Kryo;
public class Kryox extends Kryo {
private final ReflectionFactory REFLECTION_FACTORY = ReflectionFactory
.getReflectionFactory();
private final ConcurrentHashMap<Class<?>, Constructor<?>> _constructors = new ConcurrentHashMap<Class<?>, Constructor<?>>();
@Override
public <T> T newInstance(Class<T> type) {
try {
return super.newInstance(type);
} catch (Exception e) {
return (T) newInstanceFromReflectionFactory(type);
}
}
private Object newInstanceFrom(Constructor<?> constructor) {
try {
return constructor.newInstance();
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
@SuppressWarnings("unchecked")
public <T> T newInstanceFromReflectionFactory(Class<T> type) {
Constructor<?> constructor = _constructors.get(type);
if (constructor == null) {
constructor = newConstructorForSerialization(type);
Constructor<?> saved = _constructors.putIfAbsent(type, constructor);
if(saved!=null)
constructor=saved;
}
return (T) newInstanceFrom(constructor);
}
private <T> Constructor<?> newConstructorForSerialization(
Class<T> type) {
try {
Constructor<?> constructor = REFLECTION_FACTORY
.newConstructorForSerialization(type,
Object.class.getDeclaredConstructor());
constructor.setAccessible(true);
return constructor;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
分享到:
相关推荐
本主题“netty传输kryo序列化的对象基于socket传输”探讨的是如何结合Netty和Kryo,实现高效、可靠的网络数据传输。首先,我们需要了解Kryo序列化的基本原理。Kryo通过跟踪对象引用和存储类型信息来优化序列化过程,...
需要注意的是,虽然Kryo序列化速度更快,但它可能不支持所有Java类的序列化,因此在使用时需要注册自定义类或确保类具有无参构造函数。此外,Kryo序列化默认是非安全的,可能会导致内存泄漏,可以通过配置`spark....
7. **msm-kryo-serializer-2.0.0.jar**:这是Memcached Session Manager的Kryo序列化模块,专门用于将session对象序列化为Kryo格式。 8. **reflectasm-1.11.3.jar**:ReflectASM是一个优化的反射库,它提供了一种更...
此外,还可以使用第三方库如Kryo或FST,它们提供了更高效的序列化和反序列化实现。 总之,Java序列化是开发中常用的一种技术,它提供了将对象持久化和在网络间传输的能力。理解和掌握序列化原理及其实现方式,对于...
通常,序列化和反序列化的过程比直接调用`clone()`方法更耗时,但可以确保得到真正的深拷贝。 总结: 理解深拷贝和浅拷贝的概念对于编写健壮的Java代码至关重要。浅拷贝适用于不需要复制可变字段的情况,而深拷贝则...
4. **性能优化**:对于频繁进行序列化和反序列化的场景,可以考虑使用更高效的序列化框架,如`Kryo`、`FST`等。 #### 五、总结 通过上述介绍,我们可以了解到Java中对象与byte数组之间的相互转换是实现对象序列化...
4. `objenesis-2.1.jar`:Objenesis是一个Java库,用于在没有构造函数的情况下创建对象,这在某些序列化和反序列化场景中可能是必需的。 5. `msm-kryo-serializer-1.9.5.jar`:这是Memcached Session Manager的一个...
在处理Kryo序列化过程中,ASM库可能用于生成或修改字节码,优化序列化和反序列化的效率。 5. `reflectasm-1.11.4-2.jar`:ReflectASM是一个基于反射的轻量级库,提供更快的访问Java类字段和方法的能力。在处理会话...
根据之前`write()`方法中的顺序,读取相应字节并反序列化到各个字段。 三、自定义WritableComparable接口 如果自定义类型还需要作为排序的键(Key),则应实现`org.apache.hadoop.io.WritableComparable<T>`接口。...