package com.jsoniter; import com.jsoniter.spi.Decoder; import com.jsoniter.spi.JsonException; import com.jsoniter.spi.TypeLiteral; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.Type; import java.util.Collection; class ReflectionCollectionDecoder implements Decoder { private final Constructor ctor; private final Decoder compTypeDecoder; public ReflectionCollectionDecoder(Class clazz, Type[] typeArgs) { try { ctor = clazz.getConstructor(); } catch (NoSuchMethodException e) { throw new JsonException(e); } compTypeDecoder = Codegen.getDecoder(TypeLiteral.create(typeArgs[0]).getDecoderCacheKey(), typeArgs[0]); } @Override public Object decode(JsonIterator iter) throws IOException { try { return decode_(iter); } catch (Exception e) { throw new JsonException(e); } } private Object decode_(JsonIterator iter) throws Exception { Collection col = (Collection) CodegenAccess.resetExistingObject(iter); if (iter.readNull()) { return null; } if (col == null) { col = (Collection) this.ctor.newInstance(); } else { col.clear(); } while (iter.readArray()) { col.add(compTypeDecoder.decode(iter)); } return col; } }