177 lines
8.7 KiB
Java
177 lines
8.7 KiB
Java
package com.google.gson.internal;
|
|
|
|
import com.google.gson.InstanceCreator;
|
|
import com.google.gson.JsonIOException;
|
|
import com.google.gson.reflect.TypeToken;
|
|
import java.lang.reflect.Constructor;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.lang.reflect.ParameterizedType;
|
|
import java.lang.reflect.Type;
|
|
import java.util.ArrayDeque;
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.EnumSet;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.LinkedHashSet;
|
|
import java.util.Map;
|
|
import java.util.Queue;
|
|
import java.util.Set;
|
|
import java.util.SortedMap;
|
|
import java.util.SortedSet;
|
|
import java.util.TreeMap;
|
|
import java.util.TreeSet;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import java.util.concurrent.ConcurrentMap;
|
|
import java.util.concurrent.ConcurrentNavigableMap;
|
|
import java.util.concurrent.ConcurrentSkipListMap;
|
|
|
|
/* loaded from: classes.dex */
|
|
public final class ConstructorConstructor {
|
|
private final Map<Type, InstanceCreator<?>> instanceCreators;
|
|
|
|
public ConstructorConstructor(Map<Type, InstanceCreator<?>> map) {
|
|
this.instanceCreators = map;
|
|
}
|
|
|
|
private <T> ObjectConstructor<T> newDefaultConstructor(Class<? super T> cls) {
|
|
try {
|
|
final Constructor<? super T> declaredConstructor = cls.getDeclaredConstructor(new Class[0]);
|
|
if (!declaredConstructor.isAccessible()) {
|
|
declaredConstructor.setAccessible(true);
|
|
}
|
|
return new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.3
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
try {
|
|
return (T) declaredConstructor.newInstance(null);
|
|
} catch (IllegalAccessException e) {
|
|
throw new AssertionError(e);
|
|
} catch (InstantiationException e2) {
|
|
throw new RuntimeException("Failed to invoke " + declaredConstructor + " with no args", e2);
|
|
} catch (InvocationTargetException e3) {
|
|
throw new RuntimeException("Failed to invoke " + declaredConstructor + " with no args", e3.getTargetException());
|
|
}
|
|
}
|
|
};
|
|
} catch (NoSuchMethodException unused) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private <T> ObjectConstructor<T> newDefaultImplementationConstructor(final Type type, Class<? super T> cls) {
|
|
if (Collection.class.isAssignableFrom(cls)) {
|
|
return SortedSet.class.isAssignableFrom(cls) ? new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.4
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) new TreeSet();
|
|
}
|
|
} : EnumSet.class.isAssignableFrom(cls) ? new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.5
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
Type type2 = type;
|
|
if (!(type2 instanceof ParameterizedType)) {
|
|
throw new JsonIOException("Invalid EnumSet type: " + type.toString());
|
|
}
|
|
Type type3 = ((ParameterizedType) type2).getActualTypeArguments()[0];
|
|
if (type3 instanceof Class) {
|
|
return (T) EnumSet.noneOf((Class) type3);
|
|
}
|
|
throw new JsonIOException("Invalid EnumSet type: " + type.toString());
|
|
}
|
|
} : Set.class.isAssignableFrom(cls) ? new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.6
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) new LinkedHashSet();
|
|
}
|
|
} : Queue.class.isAssignableFrom(cls) ? new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.7
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) new ArrayDeque();
|
|
}
|
|
} : new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.8
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) new ArrayList();
|
|
}
|
|
};
|
|
}
|
|
if (Map.class.isAssignableFrom(cls)) {
|
|
return ConcurrentNavigableMap.class.isAssignableFrom(cls) ? new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.9
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) new ConcurrentSkipListMap();
|
|
}
|
|
} : ConcurrentMap.class.isAssignableFrom(cls) ? new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.10
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) new ConcurrentHashMap();
|
|
}
|
|
} : SortedMap.class.isAssignableFrom(cls) ? new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.11
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) new TreeMap();
|
|
}
|
|
} : (!(type instanceof ParameterizedType) || String.class.isAssignableFrom(TypeToken.get(((ParameterizedType) type).getActualTypeArguments()[0]).getRawType())) ? new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.13
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) new LinkedTreeMap();
|
|
}
|
|
} : new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.12
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) new LinkedHashMap();
|
|
}
|
|
};
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private <T> ObjectConstructor<T> newUnsafeAllocator(final Type type, final Class<? super T> cls) {
|
|
return new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.14
|
|
private final UnsafeAllocator unsafeAllocator = UnsafeAllocator.create();
|
|
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
try {
|
|
return (T) this.unsafeAllocator.newInstance(cls);
|
|
} catch (Exception e) {
|
|
throw new RuntimeException("Unable to invoke no-args constructor for " + type + ". Registering an InstanceCreator with Gson for this type may fix this problem.", e);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) {
|
|
final Type type = typeToken.getType();
|
|
Class<? super T> rawType = typeToken.getRawType();
|
|
final InstanceCreator<?> instanceCreator = this.instanceCreators.get(type);
|
|
if (instanceCreator != null) {
|
|
return new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.1
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) instanceCreator.createInstance(type);
|
|
}
|
|
};
|
|
}
|
|
final InstanceCreator<?> instanceCreator2 = this.instanceCreators.get(rawType);
|
|
if (instanceCreator2 != null) {
|
|
return new ObjectConstructor<T>() { // from class: com.google.gson.internal.ConstructorConstructor.2
|
|
@Override // com.google.gson.internal.ObjectConstructor
|
|
public T construct() {
|
|
return (T) instanceCreator2.createInstance(type);
|
|
}
|
|
};
|
|
}
|
|
ObjectConstructor<T> newDefaultConstructor = newDefaultConstructor(rawType);
|
|
if (newDefaultConstructor != null) {
|
|
return newDefaultConstructor;
|
|
}
|
|
ObjectConstructor<T> newDefaultImplementationConstructor = newDefaultImplementationConstructor(type, rawType);
|
|
return newDefaultImplementationConstructor != null ? newDefaultImplementationConstructor : newUnsafeAllocator(type, rawType);
|
|
}
|
|
|
|
public String toString() {
|
|
return this.instanceCreators.toString();
|
|
}
|
|
}
|