让kryo支持反序列化没有无参构造方法的类

动态得到类的实例,我们通常通过反射来得到。但有时候,类缺少默认构造方法,我们又不想传参来实例化,这时候怎么办呢?
我们还可以通过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);  
        }  
    }  
  
}  

转载地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值