前面介绍到MethodProxy对象,表示一个方法的代理,比如UserSerivce中的test()方法,在对应的代理类中会有对应的两个方法:

    1. public class UserInterface$$EnhancerByCGLIB$$20ecfdd implements UserInterface, Factory {
    2. final void CGLIB$test$4() {
    3. super.test();
    4. }
    5. public final void test() {
    6. MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
    7. if (var10000 == null) {
    8. CGLIB$BIND_CALLBACKS(this);
    9. var10000 = this.CGLIB$CALLBACK_0;
    10. }
    11. if (var10000 != null) {
    12. var10000.intercept(this, CGLIB$test$4$Method, CGLIB$emptyArgs, CGLIB$test$4$Proxy);
    13. } else {
    14. super.test();
    15. }
    16. }
    17. }

    而MethodProxy对象代理就是这两个方法,比如:

    1. // 表示执行某个对象的CGLIB$test$0()方法,如果o中没有CGLIB$test$0()方法则会报错
    2. methodProxy.invokeSuper(o, args)
    3. // 表示执行某个对象的test方法
    4. methodProxy.invoke(o, args)

    我们先来看一下MethodProxy对象的创建,创建的入口在代理类中:

    1. CGLIB$test$0$Proxy = MethodProxy.create(var1, var0, "()V", "test", "CGLIB$test$0");

    对应的方法为:

    1. public static MethodProxy create(Class c1, Class c2, String desc, String name1, String name2) {
    2. // c1是UserService类
    3. // c2是UserService代理类
    4. // desc是方法的返回类型 ()V
    5. // name1是方法名 test
    6. // name2是代理类中对应的另外一个方法名,CGLIB$test$0
    7. MethodProxy proxy = new MethodProxy();
    8. proxy.sig1 = new Signature(name1, desc);
    9. proxy.sig2 = new Signature(name2, desc);
    10. proxy.createInfo = new CreateInfo(c1, c2);
    11. return proxy;
    12. }

    可以发现MethodProxy对象中主要有三个属性:

    1. sig1,表示test方法
    2. sig2,表示CGLIB$test$0方法
    3. createInfo,表示UserService类和UserService代理类

    我们再来看MethodProxy的invoke()和invokeSuper()方法:

    1. public Object invoke(Object obj, Object[] args) throws Throwable {
    2. try {
    3. init();
    4. FastClassInfo fci = fastClassInfo;
    5. return fci.f1.invoke(fci.i1, obj, args);
    6. } catch (InvocationTargetException e) {
    7. throw e.getTargetException();
    8. } catch (IllegalArgumentException e) {
    9. if (fastClassInfo.i1 < 0)
    10. throw new IllegalArgumentException("Protected method: " + sig1);
    11. throw e;
    12. }
    13. }
    14. public Object invokeSuper(Object obj, Object[] args) throws Throwable {
    15. try {
    16. init();
    17. FastClassInfo fci = fastClassInfo;
    18. return fci.f2.invoke(fci.i2, obj, args);
    19. } catch (InvocationTargetException e) {
    20. throw e.getTargetException();
    21. }
    22. }

    我们可以发现,这两个方法差不多,首先都需要用到一个FastClassInfo对象,这个对象是在init()方法构造的。

    1. private void init() {
    2. if (fastClassInfo == null) {
    3. synchronized (initLock) {
    4. if (fastClassInfo == null) {
    5. CreateInfo ci = createInfo;
    6. FastClassInfo fci = new FastClassInfo();
    7. fci.f1 = helper(ci, ci.c1);
    8. fci.f2 = helper(ci, ci.c2);
    9. fci.i1 = fci.f1.getIndex(sig1);
    10. fci.i2 = fci.f2.getIndex(sig2);
    11. fastClassInfo = fci;
    12. createInfo = null;
    13. }
    14. }
    15. }
    16. }

    FastClassInfo对象中主要有四个属性:

    1. f1,UserService类对应的一个FastClass代理对象
    2. f2,UserService代理类对应的一个FastClass代理对象
    3. i1,test方法在UserService类对应的一个FastClass代理对象中的下标
    4. i2,CGLIB$test$0方法在UserService代理对对应的一个FastClass代理对象

    我们可以看到这里应该将会产生两个FastClass代理类

    以下是UserService所对应的FastClass代理类,继承了FastClass

    1. //
    2. // Source code recreated from a .class file by IntelliJ IDEA
    3. // (powered by FernFlower decompiler)
    4. //
    5. package com.zhouyu;
    6. import java.lang.reflect.InvocationTargetException;
    7. import net.sf.cglib.core.Signature;
    8. import net.sf.cglib.reflect.FastClass;
    9. public class UserService$$FastClassByCGLIB$$4fef7899 extends FastClass {
    10. public UserService$$FastClassByCGLIB$$4fef7899(Class var1) {
    11. super(var1);
    12. }
    13. public int getIndex(Signature var1) {
    14. String var10000 = var1.toString();
    15. switch(var10000.hashCode()) {
    16. case -1422510685:
    17. if (var10000.equals("test()V")) {
    18. return 0;
    19. }
    20. break;
    21. case 1826985398:
    22. if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
    23. return 1;
    24. }
    25. break;
    26. case 1913648695:
    27. if (var10000.equals("toString()Ljava/lang/String;")) {
    28. return 2;
    29. }
    30. break;
    31. case 1984935277:
    32. if (var10000.equals("hashCode()I")) {
    33. return 3;
    34. }
    35. }
    36. return -1;
    37. }
    38. public int getIndex(String var1, Class[] var2) {
    39. switch(var1.hashCode()) {
    40. case -1776922004:
    41. if (var1.equals("toString")) {
    42. switch(var2.length) {
    43. case 0:
    44. return 2;
    45. }
    46. }
    47. break;
    48. case -1295482945:
    49. if (var1.equals("equals")) {
    50. switch(var2.length) {
    51. case 1:
    52. if (var2[0].getName().equals("java.lang.Object")) {
    53. return 1;
    54. }
    55. }
    56. }
    57. break;
    58. case 3556498:
    59. if (var1.equals("test")) {
    60. switch(var2.length) {
    61. case 0:
    62. return 0;
    63. }
    64. }
    65. break;
    66. case 147696667:
    67. if (var1.equals("hashCode")) {
    68. switch(var2.length) {
    69. case 0:
    70. return 3;
    71. }
    72. }
    73. }
    74. return -1;
    75. }
    76. public int getIndex(Class[] var1) {
    77. switch(var1.length) {
    78. case 0:
    79. return 0;
    80. default:
    81. return -1;
    82. }
    83. }
    84. public Object invoke(int var1, Object var2, Object[] var3) throws InvocationTargetException {
    85. UserService var10000 = (UserService)var2;
    86. int var10001 = var1;
    87. try {
    88. switch(var10001) {
    89. case 0:
    90. var10000.test();
    91. return null;
    92. case 1:
    93. return new Boolean(var10000.equals(var3[0]));
    94. case 2:
    95. return var10000.toString();
    96. case 3:
    97. return new Integer(var10000.hashCode());
    98. }
    99. } catch (Throwable var4) {
    100. throw new InvocationTargetException(var4);
    101. }
    102. throw new IllegalArgumentException("Cannot find matching method/constructor");
    103. }
    104. public Object newInstance(int var1, Object[] var2) throws InvocationTargetException {
    105. UserService var10000 = new UserService;
    106. UserService var10001 = var10000;
    107. int var10002 = var1;
    108. try {
    109. switch(var10002) {
    110. case 0:
    111. var10001.<init>();
    112. return var10000;
    113. }
    114. } catch (Throwable var3) {
    115. throw new InvocationTargetException(var3);
    116. }
    117. throw new IllegalArgumentException("Cannot find matching method/constructor");
    118. }
    119. public int getMaxIndex() {
    120. return 3;
    121. }
    122. }

    以下是UserService代理类所对应的FastClass代理类,继承了FastClass

    1. //
    2. // Source code recreated from a .class file by IntelliJ IDEA
    3. // (powered by FernFlower decompiler)
    4. //
    5. package com.zhouyu;
    6. import com.zhouyu.UserService..EnhancerByCGLIB..4d890297;
    7. import java.lang.reflect.InvocationTargetException;
    8. import net.sf.cglib.core.Signature;
    9. import net.sf.cglib.proxy.Callback;
    10. import net.sf.cglib.reflect.FastClass;
    11. public class UserService$$EnhancerByCGLIB$$4d890297$$FastClassByCGLIB$$6ea3bb5e extends FastClass {
    12. public UserService$$EnhancerByCGLIB$$4d890297$$FastClassByCGLIB$$6ea3bb5e(Class var1) {
    13. super(var1);
    14. }
    15. public int getIndex(Signature var1) {
    16. String var10000 = var1.toString();
    17. switch(var10000.hashCode()) {
    18. case -2055565910:
    19. if (var10000.equals("CGLIB$SET_THREAD_CALLBACKS([Lnet/sf/cglib/proxy/Callback;)V")) {
    20. return 4;
    21. }
    22. break;
    23. case -1882565338:
    24. if (var10000.equals("CGLIB$equals$1(Ljava/lang/Object;)Z")) {
    25. return 9;
    26. }
    27. break;
    28. case -1659809612:
    29. if (var10000.equals("CGLIB$test$0()V")) {
    30. return 8;
    31. }
    32. break;
    33. case -1457535688:
    34. if (var10000.equals("CGLIB$STATICHOOK1()V")) {
    35. return 7;
    36. }
    37. break;
    38. case -1422510685:
    39. if (var10000.equals("test()V")) {
    40. return 20;
    41. }
    42. break;
    43. case -1411842725:
    44. if (var10000.equals("CGLIB$hashCode$3()I")) {
    45. return 11;
    46. }
    47. break;
    48. case -894172689:
    49. if (var10000.equals("newInstance(Lnet/sf/cglib/proxy/Callback;)Ljava/lang/Object;")) {
    50. return 18;
    51. }
    52. break;
    53. case -623122092:
    54. if (var10000.equals("CGLIB$findMethodProxy(Lnet/sf/cglib/core/Signature;)Lnet/sf/cglib/proxy/MethodProxy;")) {
    55. return 6;
    56. }
    57. break;
    58. case -508378822:
    59. if (var10000.equals("clone()Ljava/lang/Object;")) {
    60. return 16;
    61. }
    62. break;
    63. case -419626537:
    64. if (var10000.equals("setCallbacks([Lnet/sf/cglib/proxy/Callback;)V")) {
    65. return 1;
    66. }
    67. break;
    68. case 560567118:
    69. if (var10000.equals("setCallback(ILnet/sf/cglib/proxy/Callback;)V")) {
    70. return 0;
    71. }
    72. break;
    73. case 811063227:
    74. if (var10000.equals("newInstance([Ljava/lang/Class;[Ljava/lang/Object;[Lnet/sf/cglib/proxy/Callback;)Ljava/lang/Object;")) {
    75. return 19;
    76. }
    77. break;
    78. case 973717575:
    79. if (var10000.equals("getCallbacks()[Lnet/sf/cglib/proxy/Callback;")) {
    80. return 2;
    81. }
    82. break;
    83. case 1221173700:
    84. if (var10000.equals("newInstance([Lnet/sf/cglib/proxy/Callback;)Ljava/lang/Object;")) {
    85. return 17;
    86. }
    87. break;
    88. case 1230699260:
    89. if (var10000.equals("getCallback(I)Lnet/sf/cglib/proxy/Callback;")) {
    90. return 3;
    91. }
    92. break;
    93. case 1306468936:
    94. if (var10000.equals("CGLIB$toString$2()Ljava/lang/String;")) {
    95. return 10;
    96. }
    97. break;
    98. case 1584330438:
    99. if (var10000.equals("CGLIB$SET_STATIC_CALLBACKS([Lnet/sf/cglib/proxy/Callback;)V")) {
    100. return 5;
    101. }
    102. break;
    103. case 1800494055:
    104. if (var10000.equals("CGLIB$clone$4()Ljava/lang/Object;")) {
    105. return 12;
    106. }
    107. break;
    108. case 1826985398:
    109. if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
    110. return 13;
    111. }
    112. break;
    113. case 1913648695:
    114. if (var10000.equals("toString()Ljava/lang/String;")) {
    115. return 14;
    116. }
    117. break;
    118. case 1984935277:
    119. if (var10000.equals("hashCode()I")) {
    120. return 15;
    121. }
    122. }
    123. return -1;
    124. }
    125. public int getIndex(String var1, Class[] var2) {
    126. switch(var1.hashCode()) {
    127. case -1776922004:
    128. if (var1.equals("toString")) {
    129. switch(var2.length) {
    130. case 0:
    131. return 14;
    132. }
    133. }
    134. break;
    135. case -1295482945:
    136. if (var1.equals("equals")) {
    137. switch(var2.length) {
    138. case 1:
    139. if (var2[0].getName().equals("java.lang.Object")) {
    140. return 13;
    141. }
    142. }
    143. }
    144. break;
    145. case -1053468136:
    146. if (var1.equals("getCallbacks")) {
    147. switch(var2.length) {
    148. case 0:
    149. return 2;
    150. }
    151. }
    152. break;
    153. case -124978609:
    154. if (var1.equals("CGLIB$equals$1")) {
    155. switch(var2.length) {
    156. case 1:
    157. if (var2[0].getName().equals("java.lang.Object")) {
    158. return 9;
    159. }
    160. }
    161. }
    162. break;
    163. case -60403779:
    164. if (var1.equals("CGLIB$SET_STATIC_CALLBACKS")) {
    165. switch(var2.length) {
    166. case 1:
    167. if (var2[0].getName().equals("[Lnet.sf.cglib.proxy.Callback;")) {
    168. return 5;
    169. }
    170. }
    171. }
    172. break;
    173. case -29025555:
    174. if (var1.equals("CGLIB$hashCode$3")) {
    175. switch(var2.length) {
    176. case 0:
    177. return 11;
    178. }
    179. }
    180. break;
    181. case 3556498:
    182. if (var1.equals("test")) {
    183. switch(var2.length) {
    184. case 0:
    185. return 20;
    186. }
    187. }
    188. break;
    189. case 85179481:
    190. if (var1.equals("CGLIB$SET_THREAD_CALLBACKS")) {
    191. switch(var2.length) {
    192. case 1:
    193. if (var2[0].getName().equals("[Lnet.sf.cglib.proxy.Callback;")) {
    194. return 4;
    195. }
    196. }
    197. }
    198. break;
    199. case 94756189:
    200. if (var1.equals("clone")) {
    201. switch(var2.length) {
    202. case 0:
    203. return 16;
    204. }
    205. }
    206. break;
    207. case 147696667:
    208. if (var1.equals("hashCode")) {
    209. switch(var2.length) {
    210. case 0:
    211. return 15;
    212. }
    213. }
    214. break;
    215. case 161998109:
    216. if (var1.equals("CGLIB$STATICHOOK1")) {
    217. switch(var2.length) {
    218. case 0:
    219. return 7;
    220. }
    221. }
    222. break;
    223. case 495524492:
    224. if (var1.equals("setCallbacks")) {
    225. switch(var2.length) {
    226. case 1:
    227. if (var2[0].getName().equals("[Lnet.sf.cglib.proxy.Callback;")) {
    228. return 1;
    229. }
    230. }
    231. }
    232. break;
    233. case 543320865:
    234. if (var1.equals("CGLIB$test$0")) {
    235. switch(var2.length) {
    236. case 0:
    237. return 8;
    238. }
    239. }
    240. break;
    241. case 1154623345:
    242. if (var1.equals("CGLIB$findMethodProxy")) {
    243. switch(var2.length) {
    244. case 1:
    245. if (var2[0].getName().equals("net.sf.cglib.core.Signature")) {
    246. return 6;
    247. }
    248. }
    249. }
    250. break;
    251. case 1543336189:
    252. if (var1.equals("CGLIB$toString$2")) {
    253. switch(var2.length) {
    254. case 0:
    255. return 10;
    256. }
    257. }
    258. break;
    259. case 1811874389:
    260. if (var1.equals("newInstance")) {
    261. switch(var2.length) {
    262. case 1:
    263. String var10001 = var2[0].getName();
    264. switch(var10001.hashCode()) {
    265. case -845341380:
    266. if (var10001.equals("net.sf.cglib.proxy.Callback")) {
    267. return 18;
    268. }
    269. break;
    270. case 1730110032:
    271. if (var10001.equals("[Lnet.sf.cglib.proxy.Callback;")) {
    272. return 17;
    273. }
    274. }
    275. case 2:
    276. default:
    277. break;
    278. case 3:
    279. if (var2[0].getName().equals("[Ljava.lang.Class;") && var2[1].getName().equals("[Ljava.lang.Object;") && var2[2].getName().equals("[Lnet.sf.cglib.proxy.Callback;")) {
    280. return 19;
    281. }
    282. }
    283. }
    284. break;
    285. case 1817099975:
    286. if (var1.equals("setCallback")) {
    287. switch(var2.length) {
    288. case 2:
    289. if (var2[0].getName().equals("int") && var2[1].getName().equals("net.sf.cglib.proxy.Callback")) {
    290. return 0;
    291. }
    292. }
    293. }
    294. break;
    295. case 1905679803:
    296. if (var1.equals("getCallback")) {
    297. switch(var2.length) {
    298. case 1:
    299. if (var2[0].getName().equals("int")) {
    300. return 3;
    301. }
    302. }
    303. }
    304. break;
    305. case 1951977610:
    306. if (var1.equals("CGLIB$clone$4")) {
    307. switch(var2.length) {
    308. case 0:
    309. return 12;
    310. }
    311. }
    312. }
    313. return -1;
    314. }
    315. public int getIndex(Class[] var1) {
    316. switch(var1.length) {
    317. case 0:
    318. return 0;
    319. default:
    320. return -1;
    321. }
    322. }
    323. public Object invoke(int var1, Object var2, Object[] var3) throws InvocationTargetException {
    324. 4d890297 var10000 = (4d890297)var2;
    325. int var10001 = var1;
    326. try {
    327. switch(var10001) {
    328. case 0:
    329. var10000.setCallback(((Number)var3[0]).intValue(), (Callback)var3[1]);
    330. return null;
    331. case 1:
    332. var10000.setCallbacks((Callback[])var3[0]);
    333. return null;
    334. case 2:
    335. return var10000.getCallbacks();
    336. case 3:
    337. return var10000.getCallback(((Number)var3[0]).intValue());
    338. case 4:
    339. 4d890297.CGLIB$SET_THREAD_CALLBACKS((Callback[])var3[0]);
    340. return null;
    341. case 5:
    342. 4d890297.CGLIB$SET_STATIC_CALLBACKS((Callback[])var3[0]);
    343. return null;
    344. case 6:
    345. return 4d890297.CGLIB$findMethodProxy((Signature)var3[0]);
    346. case 7:
    347. 4d890297.CGLIB$STATICHOOK1();
    348. return null;
    349. case 8:
    350. var10000.CGLIB$test$0();
    351. return null;
    352. case 9:
    353. return new Boolean(var10000.CGLIB$equals$1(var3[0]));
    354. case 10:
    355. return var10000.CGLIB$toString$2();
    356. case 11:
    357. return new Integer(var10000.CGLIB$hashCode$3());
    358. case 12:
    359. return var10000.CGLIB$clone$4();
    360. case 13:
    361. return new Boolean(var10000.equals(var3[0]));
    362. case 14:
    363. return var10000.toString();
    364. case 15:
    365. return new Integer(var10000.hashCode());
    366. case 16:
    367. return var10000.clone();
    368. case 17:
    369. return var10000.newInstance((Callback[])var3[0]);
    370. case 18:
    371. return var10000.newInstance((Callback)var3[0]);
    372. case 19:
    373. return var10000.newInstance((Class[])var3[0], (Object[])var3[1], (Callback[])var3[2]);
    374. case 20:
    375. var10000.test();
    376. return null;
    377. }
    378. } catch (Throwable var4) {
    379. throw new InvocationTargetException(var4);
    380. }
    381. throw new IllegalArgumentException("Cannot find matching method/constructor");
    382. }
    383. public Object newInstance(int var1, Object[] var2) throws InvocationTargetException {
    384. 4d890297 var10000 = new 4d890297;
    385. 4d890297 var10001 = var10000;
    386. int var10002 = var1;
    387. try {
    388. switch(var10002) {
    389. case 0:
    390. var10001.<init>();
    391. return var10000;
    392. }
    393. } catch (Throwable var3) {
    394. throw new InvocationTargetException(var3);
    395. }
    396. throw new IllegalArgumentException("Cannot find matching method/constructor");
    397. }
    398. public int getMaxIndex() {
    399. return 20;
    400. }
    401. }

    其实这两个类类似,都是针对某一个类的FastClass代理类,所以我们好好看一下UserService所对应的FastClass,该类主要有:

    1. 一个构造方法
    2. public int getIndex(Signature var1)
    3. public int getIndex(String var1, Class[] var2)
    4. public int getIndex(Class[] var1)
    5. public Object invoke(int var1, Object var2, Object[] var3)
    6. public Object newInstance(int var1, Object[] var2)
    7. public int getMaxIndex()

    顾名思义,FastClass的作用是提高方法的执行速度,按照正常的实现,当我们调用MethodProxy对象的invoke()或invokeSuper()方法时,首先应该要做到的就是找到对应的Method对象,比如:

    1. 执行invoke(),要找到test方法对应的Method对象
    2. 执行invokeSuper(),要找到CGLIB$test$0()方法对应的Method对象

    然后利用反射来执行Method。

    那么FastClass的机制就是预先把UserService类或UserService代理类中的所有方法做一个索引,比如:

    1. public int getIndex(Signature var1) {
    2. String var10000 = var1.toString();
    3. switch(var10000.hashCode()) {
    4. case -1422510685:
    5. if (var10000.equals("test()V")) {
    6. return 0;
    7. }
    8. break;
    9. case 1826985398:
    10. if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
    11. return 1;
    12. }
    13. break;
    14. case 1913648695:
    15. if (var10000.equals("toString()Ljava/lang/String;")) {
    16. return 2;
    17. }
    18. break;
    19. case 1984935277:
    20. if (var10000.equals("hashCode()I")) {
    21. return 3;
    22. }
    23. }
    24. return -1;
    25. }

    一旦调了这个方法,就会得到当前要执行的方法所对应的index,比如test()对应的index为0
    我们再来看init()方法:

    1. private void init() {
    2. if (fastClassInfo == null) {
    3. synchronized (initLock) {
    4. if (fastClassInfo == null) {
    5. CreateInfo ci = createInfo;
    6. FastClassInfo fci = new FastClassInfo();
    7. fci.f1 = helper(ci, ci.c1);
    8. fci.f2 = helper(ci, ci.c2);
    9. fci.i1 = fci.f1.getIndex(sig1);
    10. fci.i2 = fci.f2.getIndex(sig2);
    11. fastClassInfo = fci;
    12. createInfo = null;
    13. }
    14. }
    15. }
    16. }

    两个helper()方法就是分别去生成UserService类和UserService代理类所对应的FastClass代理类。
    接下来的两个getIndex(),就是分别去:

    1. 去UserService类对应的FastClass代理类中找到test()方法的下标i1
    2. 去UserService代理类对应的FastClass代理类中找到CGLIB$test$0()方法的下标i2

    然后把两个下标都记录在fastClassInfo中。

    紧接着就会去执行:

    1. invoke:fci.f1.invoke(fci.i1, obj, args),执行UserService类对应的FastClass代理类的invoke方法
    2. invokeSuper:fci.f2.invoke(fci.i2, obj, args),执行UserService代理类对应的FastClass代理类的invoke方法

    比如UserService类对应的FastClass代理类的invoke方法的代码为:

    1. public Object invoke(int var1, Object var2, Object[] var3) throws InvocationTargetException {
    2. UserService var10000 = (UserService)var2;
    3. int var10001 = var1;
    4. try {
    5. switch(var10001) {
    6. case 0:
    7. var10000.test();
    8. return null;
    9. case 1:
    10. return new Boolean(var10000.equals(var3[0]));
    11. case 2:
    12. return var10000.toString();
    13. case 3:
    14. return new Integer(var10000.hashCode());
    15. }
    16. } catch (Throwable var4) {
    17. throw new InvocationTargetException(var4);
    18. }
    19. throw new IllegalArgumentException("Cannot find matching method/constructor");
    20. }

    我们可以发现代码还是比较简单的,比如如果传入的下标是0,那么就会执行var2的test();

    对于UserService代理类对应的FastClass代理类也类似:

    1. public Object invoke(int var1, Object var2, Object[] var3) throws InvocationTargetException {
    2. 4d890297 var10000 = (4d890297)var2;
    3. int var10001 = var1;
    4. try {
    5. switch(var10001) {
    6. case 0:
    7. var10000.setCallback(((Number)var3[0]).intValue(), (Callback)var3[1]);
    8. return null;
    9. case 1:
    10. var10000.setCallbacks((Callback[])var3[0]);
    11. return null;
    12. case 2:
    13. return var10000.getCallbacks();
    14. case 3:
    15. return var10000.getCallback(((Number)var3[0]).intValue());
    16. case 4:
    17. 4d890297.CGLIB$SET_THREAD_CALLBACKS((Callback[])var3[0]);
    18. return null;
    19. case 5:
    20. 4d890297.CGLIB$SET_STATIC_CALLBACKS((Callback[])var3[0]);
    21. return null;
    22. case 6:
    23. return 4d890297.CGLIB$findMethodProxy((Signature)var3[0]);
    24. case 7:
    25. 4d890297.CGLIB$STATICHOOK1();
    26. return null;
    27. case 8:
    28. var10000.CGLIB$test$0();
    29. return null;
    30. case 9:
    31. return new Boolean(var10000.CGLIB$equals$1(var3[0]));
    32. case 10:
    33. return var10000.CGLIB$toString$2();
    34. case 11:
    35. return new Integer(var10000.CGLIB$hashCode$3());
    36. case 12:
    37. return var10000.CGLIB$clone$4();
    38. case 13:
    39. return new Boolean(var10000.equals(var3[0]));
    40. case 14:
    41. return var10000.toString();
    42. case 15:
    43. return new Integer(var10000.hashCode());
    44. case 16:
    45. return var10000.clone();
    46. case 17:
    47. return var10000.newInstance((Callback[])var3[0]);
    48. case 18:
    49. return var10000.newInstance((Callback)var3[0]);
    50. case 19:
    51. return var10000.newInstance((Class[])var3[0], (Object[])var3[1], (Callback[])var3[2]);
    52. case 20:
    53. var10000.test();
    54. return null;
    55. }
    56. } catch (Throwable var4) {
    57. throw new InvocationTargetException(var4);
    58. }
    59. throw new IllegalArgumentException("Cannot find matching method/constructor");
    60. }

    比如下标为8,就会执行var10000.CGLIB$test$0();
    比如下标为20,就会执行var10000.test();
    而var10000,是所传入对象强制转化为4d890297类的对象,4d890297其实就是UserService的代理类。

    所以我们可以发现,当执行invokeSuper()这个方法时,不能传入UserService对象,只能传入UserService的代理对象,不然就不能转换成为UserService代理类类型。

    所以FastClass,快的地方就是预先把方法信息都生成好了,在真正调用的时候,不用再去找Method对象,而是直接就执行方法了。