UnsafeAllocator.smali 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. .class public abstract Lcom/google/gson/internal/UnsafeAllocator;
  2. .super Ljava/lang/Object;
  3. .source "UnsafeAllocator.java"
  4. # direct methods
  5. .method public constructor <init>()V
  6. .locals 0
  7. .line 31
  8. invoke-direct {p0}, Ljava/lang/Object;-><init>()V
  9. return-void
  10. .end method
  11. .method static assertInstantiable(Ljava/lang/Class;)V
  12. .locals 4
  13. .annotation system Ldalvik/annotation/Signature;
  14. value = {
  15. "(",
  16. "Ljava/lang/Class<",
  17. "*>;)V"
  18. }
  19. .end annotation
  20. .line 115
  21. .local p0, "c":Ljava/lang/Class;, "Ljava/lang/Class<*>;"
  22. invoke-virtual {p0}, Ljava/lang/Class;->getModifiers()I
  23. move-result v0
  24. .line 116
  25. .local v0, "modifiers":I
  26. invoke-static {v0}, Ljava/lang/reflect/Modifier;->isInterface(I)Z
  27. move-result v1
  28. if-nez v1, :cond_1
  29. .line 119
  30. invoke-static {v0}, Ljava/lang/reflect/Modifier;->isAbstract(I)Z
  31. move-result v1
  32. if-nez v1, :cond_0
  33. .line 122
  34. return-void
  35. .line 120
  36. :cond_0
  37. new-instance v1, Ljava/lang/UnsupportedOperationException;
  38. new-instance v2, Ljava/lang/StringBuilder;
  39. invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
  40. const-string v3, "Abstract class can\'t be instantiated! Class name: "
  41. invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  42. invoke-virtual {p0}, Ljava/lang/Class;->getName()Ljava/lang/String;
  43. move-result-object v3
  44. invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  45. invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
  46. move-result-object v2
  47. invoke-direct {v1, v2}, Ljava/lang/UnsupportedOperationException;-><init>(Ljava/lang/String;)V
  48. throw v1
  49. .line 117
  50. :cond_1
  51. new-instance v1, Ljava/lang/UnsupportedOperationException;
  52. new-instance v2, Ljava/lang/StringBuilder;
  53. invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V
  54. const-string v3, "Interface can\'t be instantiated! Interface name: "
  55. invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  56. invoke-virtual {p0}, Ljava/lang/Class;->getName()Ljava/lang/String;
  57. move-result-object v3
  58. invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
  59. invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
  60. move-result-object v2
  61. invoke-direct {v1, v2}, Ljava/lang/UnsupportedOperationException;-><init>(Ljava/lang/String;)V
  62. throw v1
  63. .end method
  64. .method public static create()Lcom/google/gson/internal/UnsafeAllocator;
  65. .locals 10
  66. .line 40
  67. const-string v0, "newInstance"
  68. const/4 v1, 0x0
  69. const/4 v2, 0x0
  70. const/4 v3, 0x1
  71. :try_start_0
  72. const-string v4, "sun.misc.Unsafe"
  73. invoke-static {v4}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
  74. move-result-object v4
  75. .line 41
  76. .local v4, "unsafeClass":Ljava/lang/Class;, "Ljava/lang/Class<*>;"
  77. const-string v5, "theUnsafe"
  78. invoke-virtual {v4, v5}, Ljava/lang/Class;->getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;
  79. move-result-object v5
  80. .line 42
  81. .local v5, "f":Ljava/lang/reflect/Field;
  82. invoke-virtual {v5, v3}, Ljava/lang/reflect/Field;->setAccessible(Z)V
  83. .line 43
  84. invoke-virtual {v5, v1}, Ljava/lang/reflect/Field;->get(Ljava/lang/Object;)Ljava/lang/Object;
  85. move-result-object v6
  86. .line 44
  87. .local v6, "unsafe":Ljava/lang/Object;
  88. const-string v7, "allocateInstance"
  89. new-array v8, v3, [Ljava/lang/Class;
  90. const-class v9, Ljava/lang/Class;
  91. aput-object v9, v8, v2
  92. invoke-virtual {v4, v7, v8}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
  93. move-result-object v7
  94. .line 45
  95. .local v7, "allocateInstance":Ljava/lang/reflect/Method;
  96. new-instance v8, Lcom/google/gson/internal/UnsafeAllocator$1;
  97. invoke-direct {v8, v7, v6}, Lcom/google/gson/internal/UnsafeAllocator$1;-><init>(Ljava/lang/reflect/Method;Ljava/lang/Object;)V
  98. :try_end_0
  99. .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0
  100. return-object v8
  101. .line 53
  102. .end local v4 # "unsafeClass":Ljava/lang/Class;, "Ljava/lang/Class<*>;"
  103. .end local v5 # "f":Ljava/lang/reflect/Field;
  104. .end local v6 # "unsafe":Ljava/lang/Object;
  105. .end local v7 # "allocateInstance":Ljava/lang/reflect/Method;
  106. :catch_0
  107. move-exception v4
  108. .line 62
  109. const/4 v4, 0x2
  110. :try_start_1
  111. const-class v5, Ljava/io/ObjectStreamClass;
  112. const-string v6, "getConstructorId"
  113. new-array v7, v3, [Ljava/lang/Class;
  114. const-class v8, Ljava/lang/Class;
  115. aput-object v8, v7, v2
  116. .line 63
  117. invoke-virtual {v5, v6, v7}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
  118. move-result-object v5
  119. .line 64
  120. .local v5, "getConstructorId":Ljava/lang/reflect/Method;
  121. invoke-virtual {v5, v3}, Ljava/lang/reflect/Method;->setAccessible(Z)V
  122. .line 65
  123. new-array v6, v3, [Ljava/lang/Object;
  124. const-class v7, Ljava/lang/Object;
  125. aput-object v7, v6, v2
  126. invoke-virtual {v5, v1, v6}, Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;
  127. move-result-object v1
  128. check-cast v1, Ljava/lang/Integer;
  129. invoke-virtual {v1}, Ljava/lang/Integer;->intValue()I
  130. move-result v1
  131. .line 66
  132. .local v1, "constructorId":I
  133. const-class v6, Ljava/io/ObjectStreamClass;
  134. new-array v7, v4, [Ljava/lang/Class;
  135. const-class v8, Ljava/lang/Class;
  136. aput-object v8, v7, v2
  137. sget-object v8, Ljava/lang/Integer;->TYPE:Ljava/lang/Class;
  138. aput-object v8, v7, v3
  139. .line 67
  140. invoke-virtual {v6, v0, v7}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
  141. move-result-object v6
  142. .line 68
  143. .local v6, "newInstance":Ljava/lang/reflect/Method;
  144. invoke-virtual {v6, v3}, Ljava/lang/reflect/Method;->setAccessible(Z)V
  145. .line 69
  146. new-instance v7, Lcom/google/gson/internal/UnsafeAllocator$2;
  147. invoke-direct {v7, v6, v1}, Lcom/google/gson/internal/UnsafeAllocator$2;-><init>(Ljava/lang/reflect/Method;I)V
  148. :try_end_1
  149. .catch Ljava/lang/Exception; {:try_start_1 .. :try_end_1} :catch_1
  150. return-object v7
  151. .line 77
  152. .end local v1 # "constructorId":I
  153. .end local v5 # "getConstructorId":Ljava/lang/reflect/Method;
  154. .end local v6 # "newInstance":Ljava/lang/reflect/Method;
  155. :catch_1
  156. move-exception v1
  157. .line 86
  158. :try_start_2
  159. const-class v1, Ljava/io/ObjectInputStream;
  160. new-array v4, v4, [Ljava/lang/Class;
  161. const-class v5, Ljava/lang/Class;
  162. aput-object v5, v4, v2
  163. const-class v2, Ljava/lang/Class;
  164. aput-object v2, v4, v3
  165. .line 87
  166. invoke-virtual {v1, v0, v4}, Ljava/lang/Class;->getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
  167. move-result-object v0
  168. .line 88
  169. .local v0, "newInstance":Ljava/lang/reflect/Method;
  170. invoke-virtual {v0, v3}, Ljava/lang/reflect/Method;->setAccessible(Z)V
  171. .line 89
  172. new-instance v1, Lcom/google/gson/internal/UnsafeAllocator$3;
  173. invoke-direct {v1, v0}, Lcom/google/gson/internal/UnsafeAllocator$3;-><init>(Ljava/lang/reflect/Method;)V
  174. :try_end_2
  175. .catch Ljava/lang/Exception; {:try_start_2 .. :try_end_2} :catch_2
  176. return-object v1
  177. .line 97
  178. .end local v0 # "newInstance":Ljava/lang/reflect/Method;
  179. :catch_2
  180. move-exception v0
  181. .line 101
  182. new-instance v0, Lcom/google/gson/internal/UnsafeAllocator$4;
  183. invoke-direct {v0}, Lcom/google/gson/internal/UnsafeAllocator$4;-><init>()V
  184. return-object v0
  185. .end method
  186. # virtual methods
  187. .method public abstract newInstance(Ljava/lang/Class;)Ljava/lang/Object;
  188. .annotation system Ldalvik/annotation/Signature;
  189. value = {
  190. "<T:",
  191. "Ljava/lang/Object;",
  192. ">(",
  193. "Ljava/lang/Class<",
  194. "TT;>;)TT;"
  195. }
  196. .end annotation
  197. .annotation system Ldalvik/annotation/Throws;
  198. value = {
  199. Ljava/lang/Exception;
  200. }
  201. .end annotation
  202. .end method