.class public final Lcom/google/gson/internal/ConstructorConstructor; .super Ljava/lang/Object; .source "ConstructorConstructor.java" # instance fields .field private final instanceCreators:Ljava/util/Map; .annotation system Ldalvik/annotation/Signature; value = { "Ljava/util/Map<", "Ljava/lang/reflect/Type;", "Lcom/google/gson/InstanceCreator<", "*>;>;" } .end annotation .end field .field private final reflectionFilters:Ljava/util/List; .annotation system Ldalvik/annotation/Signature; value = { "Ljava/util/List<", "Lcom/google/gson/ReflectionAccessFilter;", ">;" } .end annotation .end field .field private final useJdkUnsafe:Z # direct methods .method public constructor (Ljava/util/Map;ZLjava/util/List;)V .registers 4 .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/util/Map<", "Ljava/lang/reflect/Type;", "Lcom/google/gson/InstanceCreator<", "*>;>;Z", "Ljava/util/List<", "Lcom/google/gson/ReflectionAccessFilter;", ">;)V" } .end annotation .line 58 invoke-direct {p0}, Ljava/lang/Object;->()V .line 59 iput-object p1, p0, Lcom/google/gson/internal/ConstructorConstructor;->instanceCreators:Ljava/util/Map; .line 60 iput-boolean p2, p0, Lcom/google/gson/internal/ConstructorConstructor;->useJdkUnsafe:Z .line 61 iput-object p3, p0, Lcom/google/gson/internal/ConstructorConstructor;->reflectionFilters:Ljava/util/List; return-void .end method .method static checkInstantiable(Ljava/lang/Class;)Ljava/lang/String; .registers 3 .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/lang/Class<", "*>;)", "Ljava/lang/String;" } .end annotation .line 71 invoke-virtual {p0}, Ljava/lang/Class;->getModifiers()I move-result v0 .line 72 invoke-static {v0}, Ljava/lang/reflect/Modifier;->isInterface(I)Z move-result v1 if-eqz v1, :cond_1e .line 73 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "Interfaces can\'t be instantiated! Register an InstanceCreator or a TypeAdapter for this type. Interface name: " invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V .line 74 invoke-virtual {p0}, Ljava/lang/Class;->getName()Ljava/lang/String; move-result-object p0 invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 return-object p0 .line 76 :cond_1e invoke-static {v0}, Ljava/lang/reflect/Modifier;->isAbstract(I)Z move-result v0 if-eqz v0, :cond_38 .line 77 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "Abstract classes can\'t be instantiated! Register an InstanceCreator or a TypeAdapter for this type. Class name: " invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V .line 78 invoke-virtual {p0}, Ljava/lang/Class;->getName()Ljava/lang/String; move-result-object p0 invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 return-object p0 :cond_38 const/4 p0, 0x0 return-object p0 .end method .method private static newDefaultConstructor(Ljava/lang/Class;Lcom/google/gson/ReflectionAccessFilter$FilterResult;)Lcom/google/gson/internal/ObjectConstructor; .registers 5 .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/lang/Class<", "-TT;>;", "Lcom/google/gson/ReflectionAccessFilter$FilterResult;", ")", "Lcom/google/gson/internal/ObjectConstructor<", "TT;>;" } .end annotation .line 206 invoke-virtual {p0}, Ljava/lang/Class;->getModifiers()I move-result v0 invoke-static {v0}, Ljava/lang/reflect/Modifier;->isAbstract(I)Z move-result v0 const/4 v1, 0x0 if-eqz v0, :cond_c return-object v1 :cond_c const/4 v0, 0x0 .line 212 :try_start_d new-array v0, v0, [Ljava/lang/Class; invoke-virtual {p0, v0}, Ljava/lang/Class;->getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor; move-result-object v0 :try_end_13 .catch Ljava/lang/NoSuchMethodException; {:try_start_d .. :try_end_13} :catch_5d .line 217 sget-object v2, Lcom/google/gson/ReflectionAccessFilter$FilterResult;->ALLOW:Lcom/google/gson/ReflectionAccessFilter$FilterResult; if-eq p1, v2, :cond_47 invoke-static {v0, v1}, Lcom/google/gson/internal/ReflectionAccessFilterHelper;->canAccess(Ljava/lang/reflect/AccessibleObject;Ljava/lang/Object;)Z move-result v1 if-eqz v1, :cond_2c sget-object v1, Lcom/google/gson/ReflectionAccessFilter$FilterResult;->BLOCK_ALL:Lcom/google/gson/ReflectionAccessFilter$FilterResult; if-ne p1, v1, :cond_47 .line 219 invoke-virtual {v0}, Ljava/lang/reflect/Constructor;->getModifiers()I move-result v1 invoke-static {v1}, Ljava/lang/reflect/Modifier;->isPublic(I)Z move-result v1 if-eqz v1, :cond_2c goto :goto_47 .line 222 :cond_2c new-instance p1, Ljava/lang/StringBuilder; const-string v0, "Unable to invoke no-args constructor of " invoke-direct {p1, v0}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {p1, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object p0 const-string p1, "; constructor is not accessible and ReflectionAccessFilter does not permit making it accessible. Register an InstanceCreator or a TypeAdapter for this type, change the visibility of the constructor or adjust the access filter." invoke-virtual {p0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p0 invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p0 .line 226 new-instance p1, Lcom/google/gson/internal/ConstructorConstructor$7; invoke-direct {p1, p0}, Lcom/google/gson/internal/ConstructorConstructor$7;->(Ljava/lang/String;)V return-object p1 .line 235 :cond_47 :goto_47 sget-object p0, Lcom/google/gson/ReflectionAccessFilter$FilterResult;->ALLOW:Lcom/google/gson/ReflectionAccessFilter$FilterResult; if-ne p1, p0, :cond_57 .line 236 invoke-static {v0}, Lcom/google/gson/internal/reflect/ReflectionHelper;->tryMakeAccessible(Ljava/lang/reflect/Constructor;)Ljava/lang/String; move-result-object p0 if-eqz p0, :cond_57 .line 246 new-instance p1, Lcom/google/gson/internal/ConstructorConstructor$8; invoke-direct {p1, p0}, Lcom/google/gson/internal/ConstructorConstructor$8;->(Ljava/lang/String;)V return-object p1 .line 258 :cond_57 new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$9; invoke-direct {p0, v0}, Lcom/google/gson/internal/ConstructorConstructor$9;->(Ljava/lang/reflect/Constructor;)V return-object p0 :catch_5d return-object v1 .end method .method private static newDefaultImplementationConstructor(Ljava/lang/reflect/Type;Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor; .registers 3 .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/lang/reflect/Type;", "Ljava/lang/Class<", "-TT;>;)", "Lcom/google/gson/internal/ObjectConstructor<", "TT;>;" } .end annotation .line 298 const-class v0, Ljava/util/Collection; invoke-virtual {v0, p1}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result v0 if-eqz v0, :cond_38 .line 299 const-class p0, Ljava/util/SortedSet; invoke-virtual {p0, p1}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result p0 if-eqz p0, :cond_16 .line 300 new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$10; invoke-direct {p0}, Lcom/google/gson/internal/ConstructorConstructor$10;->()V return-object p0 .line 305 :cond_16 const-class p0, Ljava/util/Set; invoke-virtual {p0, p1}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result p0 if-eqz p0, :cond_24 .line 306 new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$11; invoke-direct {p0}, Lcom/google/gson/internal/ConstructorConstructor$11;->()V return-object p0 .line 311 :cond_24 const-class p0, Ljava/util/Queue; invoke-virtual {p0, p1}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result p0 if-eqz p0, :cond_32 .line 312 new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$12; invoke-direct {p0}, Lcom/google/gson/internal/ConstructorConstructor$12;->()V return-object p0 .line 318 :cond_32 new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$13; invoke-direct {p0}, Lcom/google/gson/internal/ConstructorConstructor$13;->()V return-object p0 .line 326 :cond_38 const-class v0, Ljava/util/Map; invoke-virtual {v0, p1}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result v0 if-eqz v0, :cond_93 .line 327 const-class v0, Ljava/util/concurrent/ConcurrentNavigableMap; invoke-virtual {v0, p1}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result v0 if-eqz v0, :cond_4e .line 328 new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$14; invoke-direct {p0}, Lcom/google/gson/internal/ConstructorConstructor$14;->()V return-object p0 .line 333 :cond_4e const-class v0, Ljava/util/concurrent/ConcurrentMap; invoke-virtual {v0, p1}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result v0 if-eqz v0, :cond_5c .line 334 new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$15; invoke-direct {p0}, Lcom/google/gson/internal/ConstructorConstructor$15;->()V return-object p0 .line 339 :cond_5c const-class v0, Ljava/util/SortedMap; invoke-virtual {v0, p1}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result p1 if-eqz p1, :cond_6a .line 340 new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$16; invoke-direct {p0}, Lcom/google/gson/internal/ConstructorConstructor$16;->()V return-object p0 .line 345 :cond_6a instance-of p1, p0, Ljava/lang/reflect/ParameterizedType; if-eqz p1, :cond_8d const-class p1, Ljava/lang/String; check-cast p0, Ljava/lang/reflect/ParameterizedType; .line 346 invoke-interface {p0}, Ljava/lang/reflect/ParameterizedType;->getActualTypeArguments()[Ljava/lang/reflect/Type; move-result-object p0 const/4 v0, 0x0 aget-object p0, p0, v0 invoke-static {p0}, Lcom/google/gson/reflect/TypeToken;->get(Ljava/lang/reflect/Type;)Lcom/google/gson/reflect/TypeToken; move-result-object p0 invoke-virtual {p0}, Lcom/google/gson/reflect/TypeToken;->getRawType()Ljava/lang/Class; move-result-object p0 .line 345 invoke-virtual {p1, p0}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result p0 if-nez p0, :cond_8d .line 347 new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$17; invoke-direct {p0}, Lcom/google/gson/internal/ConstructorConstructor$17;->()V return-object p0 .line 353 :cond_8d new-instance p0, Lcom/google/gson/internal/ConstructorConstructor$18; invoke-direct {p0}, Lcom/google/gson/internal/ConstructorConstructor$18;->()V return-object p0 :cond_93 const/4 p0, 0x0 return-object p0 .end method .method private static newSpecialCollectionConstructor(Ljava/lang/reflect/Type;Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor; .registers 3 .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/lang/reflect/Type;", "Ljava/lang/Class<", "-TT;>;)", "Lcom/google/gson/internal/ObjectConstructor<", "TT;>;" } .end annotation .line 162 const-class v0, Ljava/util/EnumSet; invoke-virtual {v0, p1}, Ljava/lang/Class;->isAssignableFrom(Ljava/lang/Class;)Z move-result v0 if-eqz v0, :cond_e .line 163 new-instance p1, Lcom/google/gson/internal/ConstructorConstructor$5; invoke-direct {p1, p0}, Lcom/google/gson/internal/ConstructorConstructor$5;->(Ljava/lang/reflect/Type;)V return-object p1 .line 182 :cond_e const-class v0, Ljava/util/EnumMap; if-ne p1, v0, :cond_18 .line 183 new-instance p1, Lcom/google/gson/internal/ConstructorConstructor$6; invoke-direct {p1, p0}, Lcom/google/gson/internal/ConstructorConstructor$6;->(Ljava/lang/reflect/Type;)V return-object p1 :cond_18 const/4 p0, 0x0 return-object p0 .end method .method private newUnsafeAllocator(Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor; .registers 4 .annotation system Ldalvik/annotation/Signature; value = { "(", "Ljava/lang/Class<", "-TT;>;)", "Lcom/google/gson/internal/ObjectConstructor<", "TT;>;" } .end annotation .line 365 iget-boolean v0, p0, Lcom/google/gson/internal/ConstructorConstructor;->useJdkUnsafe:Z if-eqz v0, :cond_a .line 366 new-instance v0, Lcom/google/gson/internal/ConstructorConstructor$19; invoke-direct {v0, p0, p1}, Lcom/google/gson/internal/ConstructorConstructor$19;->(Lcom/google/gson/internal/ConstructorConstructor;Ljava/lang/Class;)V return-object v0 .line 380 :cond_a new-instance v0, Ljava/lang/StringBuilder; const-string v1, "Unable to create instance of " invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object p1 const-string v0, "; usage of JDK Unsafe is disabled. Registering an InstanceCreator or a TypeAdapter for this type, adding a no-args constructor, or enabling usage of JDK Unsafe may fix this problem." invoke-virtual {p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p1 invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p1 .line 383 new-instance v0, Lcom/google/gson/internal/ConstructorConstructor$20; invoke-direct {v0, p0, p1}, Lcom/google/gson/internal/ConstructorConstructor$20;->(Lcom/google/gson/internal/ConstructorConstructor;Ljava/lang/String;)V return-object v0 .end method # virtual methods .method public get(Lcom/google/gson/reflect/TypeToken;)Lcom/google/gson/internal/ObjectConstructor; .registers 5 .annotation system Ldalvik/annotation/Signature; value = { "(", "Lcom/google/gson/reflect/TypeToken<", "TT;>;)", "Lcom/google/gson/internal/ObjectConstructor<", "TT;>;" } .end annotation .line 84 invoke-virtual {p1}, Lcom/google/gson/reflect/TypeToken;->getType()Ljava/lang/reflect/Type; move-result-object v0 .line 85 invoke-virtual {p1}, Lcom/google/gson/reflect/TypeToken;->getRawType()Ljava/lang/Class; move-result-object p1 .line 90 iget-object v1, p0, Lcom/google/gson/internal/ConstructorConstructor;->instanceCreators:Ljava/util/Map; invoke-interface {v1, v0}, Ljava/util/Map;->get(Ljava/lang/Object;)Ljava/lang/Object; move-result-object v1 check-cast v1, Lcom/google/gson/InstanceCreator; if-eqz v1, :cond_18 .line 92 new-instance p1, Lcom/google/gson/internal/ConstructorConstructor$1; invoke-direct {p1, p0, v1, v0}, Lcom/google/gson/internal/ConstructorConstructor$1;->(Lcom/google/gson/internal/ConstructorConstructor;Lcom/google/gson/InstanceCreator;Ljava/lang/reflect/Type;)V return-object p1 .line 101 :cond_18 iget-object v1, p0, Lcom/google/gson/internal/ConstructorConstructor;->instanceCreators:Ljava/util/Map; .line 102 invoke-interface {v1, p1}, Ljava/util/Map;->get(Ljava/lang/Object;)Ljava/lang/Object; move-result-object v1 check-cast v1, Lcom/google/gson/InstanceCreator; if-eqz v1, :cond_28 .line 104 new-instance p1, Lcom/google/gson/internal/ConstructorConstructor$2; invoke-direct {p1, p0, v1, v0}, Lcom/google/gson/internal/ConstructorConstructor$2;->(Lcom/google/gson/internal/ConstructorConstructor;Lcom/google/gson/InstanceCreator;Ljava/lang/reflect/Type;)V return-object p1 .line 114 :cond_28 invoke-static {v0, p1}, Lcom/google/gson/internal/ConstructorConstructor;->newSpecialCollectionConstructor(Ljava/lang/reflect/Type;Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor; move-result-object v1 if-eqz v1, :cond_2f return-object v1 .line 119 :cond_2f iget-object v1, p0, Lcom/google/gson/internal/ConstructorConstructor;->reflectionFilters:Ljava/util/List; invoke-static {v1, p1}, Lcom/google/gson/internal/ReflectionAccessFilterHelper;->getFilterResult(Ljava/util/List;Ljava/lang/Class;)Lcom/google/gson/ReflectionAccessFilter$FilterResult; move-result-object v1 .line 120 invoke-static {p1, v1}, Lcom/google/gson/internal/ConstructorConstructor;->newDefaultConstructor(Ljava/lang/Class;Lcom/google/gson/ReflectionAccessFilter$FilterResult;)Lcom/google/gson/internal/ObjectConstructor; move-result-object v2 if-eqz v2, :cond_3c return-object v2 .line 125 :cond_3c invoke-static {v0, p1}, Lcom/google/gson/internal/ConstructorConstructor;->newDefaultImplementationConstructor(Ljava/lang/reflect/Type;Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor; move-result-object v0 if-eqz v0, :cond_43 return-object v0 .line 132 :cond_43 invoke-static {p1}, Lcom/google/gson/internal/ConstructorConstructor;->checkInstantiable(Ljava/lang/Class;)Ljava/lang/String; move-result-object v0 if-eqz v0, :cond_4f .line 134 new-instance p1, Lcom/google/gson/internal/ConstructorConstructor$3; invoke-direct {p1, p0, v0}, Lcom/google/gson/internal/ConstructorConstructor$3;->(Lcom/google/gson/internal/ConstructorConstructor;Ljava/lang/String;)V return-object p1 .line 143 :cond_4f sget-object v0, Lcom/google/gson/ReflectionAccessFilter$FilterResult;->ALLOW:Lcom/google/gson/ReflectionAccessFilter$FilterResult; if-ne v1, v0, :cond_58 .line 145 invoke-direct {p0, p1}, Lcom/google/gson/internal/ConstructorConstructor;->newUnsafeAllocator(Ljava/lang/Class;)Lcom/google/gson/internal/ObjectConstructor; move-result-object p1 return-object p1 .line 147 :cond_58 new-instance v0, Ljava/lang/StringBuilder; const-string v1, "Unable to create instance of " invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder; move-result-object p1 const-string v0, "; ReflectionAccessFilter does not permit using reflection or Unsafe. Register an InstanceCreator or a TypeAdapter for this type or adjust the access filter to allow using reflection." invoke-virtual {p1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object p1 invoke-virtual {p1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; move-result-object p1 .line 150 new-instance v0, Lcom/google/gson/internal/ConstructorConstructor$4; invoke-direct {v0, p0, p1}, Lcom/google/gson/internal/ConstructorConstructor$4;->(Lcom/google/gson/internal/ConstructorConstructor;Ljava/lang/String;)V return-object v0 .end method .method public toString()Ljava/lang/String; .registers 2 .line 392 iget-object v0, p0, Lcom/google/gson/internal/ConstructorConstructor;->instanceCreators:Ljava/util/Map; invoke-virtual {v0}, Ljava/lang/Object;->toString()Ljava/lang/String; move-result-object v0 return-object v0 .end method