protected Object newInstance(ConvertContext context, BeanType bt, Map<String, Object> map){
ReflectClass cls = bt.getReflectClass();
ConvertContext.ConcreteTypes types = null == context ? null : context.getConcreteTypes();
if(null != types) {
Object instance = types.newInstance(context, bt.getBeanClass(), null, map);
if(null != instance) {
return instance;
}
}
if(cls.isAbstract() || cls.isInterface()) {
throw new ConvertException("Cannot new instance for abstract class or interface '" + bt.getBeanClass().getName() + "'");
}else if(cls.hasDefaultConstructor()){
return bt.newInstance();
}else{
ReflectConstructor c = cls.getConstructors()[0];
ReflectParameter[] ps = c.getParameters();
Object[] args = new Object[c.getParameters().length];
for(int i=0;i<args.length;i++){
ReflectParameter p = ps[i];
args[i] = Converts.convert(map.get(p.getName()), p.getType(), p.getGenericType(), context);
}
return c.newInstance(args);
}
}