动态代理方案性能对比(转载)

原文 http://javatar.iteye.com/blog/814426

转于自己在公司的Blog:
http://pt.alibaba-inc.com/wp/experience_1054/dynamic_proxy_performance.html

因服务框架需要用动态代理生成客户端接口的stub,所以做了一下性能评测,
动态代理工具比较成熟的产品有:
JDK自带的,ASM,CGLIB(基于ASM包装),JAVAASSIST,
使用的版本分别为:
JDK-1.6.0_18-b07, ASM-3.3, CGLIB-2.2, JAVAASSIST-3.11.0.GA

(一) 测试结果:
数据为执行三次,每次调用一千万次代理方法的结果,测试代码后面有贴出。

(1) PC机测试结果:Linux 2.6.9-42.ELsmp(32bit), 2 Cores CPU(Intel Pentium4 3.06GHz)

Java代码  收藏代码
  1. Create JDK Proxy: 13 ms  
  2. Create CGLIB Proxy: 217 ms  
  3. Create JAVAASSIST Proxy: 99 ms  
  4. Create JAVAASSIST Bytecode Proxy: 168 ms  
  5. Create ASM Proxy: 3 ms  
  6. ================  
  7. Run JDK Proxy: 2224 ms, 634,022 t/s  
  8. Run CGLIB Proxy: 1123 ms, 1,255,623 t/s  
  9. Run JAVAASSIST Proxy: 3212 ms, 438,999 t/s  
  10. Run JAVAASSIST Bytecode Proxy: 206 ms, 6,844,977 t/s  
  11. Run ASM Bytecode Proxy: 209 ms, 6,746,724 t/s  
  12. ----------------  
  13. Run JDK Proxy: 2169 ms, 650,099 t/s  
  14. Run CGLIB Proxy: 1059 ms, 1,331,506 t/s  
  15. Run JAVAASSIST Proxy: 3328 ms, 423,697 t/s  
  16. Run JAVAASSIST Bytecode Proxy: 202 ms, 6,980,521 t/s  
  17. Run ASM Bytecode Proxy: 206 ms, 6,844,977 t/s  
  18. ----------------  
  19. Run JDK Proxy: 2174 ms, 648,604 t/s  
  20. Run CGLIB Proxy: 1032 ms, 1,366,342 t/s  
  21. Run JAVAASSIST Proxy: 3119 ms, 452,088 t/s  
  22. Run JAVAASSIST Bytecode Proxy: 207 ms, 6,811,910 t/s  
  23. Run ASM Bytecode Proxy: 207 ms, 6,811,910 t/s  
  24. ----------------  



(2) 服务器测试结果:Linux 2.6.18-128.el5xen(64bit), 16 Cores CPU(Intel Xeon E5520 2.27GHz)

Java代码  收藏代码
  1. Create JDK Proxy: 7 ms  
  2. Create CGLIB Proxy: 86 ms  
  3. Create JAVAASSIST Proxy: 36 ms  
  4. Create JAVAASSIST Bytecode Proxy: 57 ms  
  5. Create ASM Proxy: 1 ms  
  6. ================  
  7. Run JDK Proxy: 235 ms, 6,000,278 t/s  
  8. Run CGLIB Proxy: 234 ms, 6,025,920 t/s  
  9. Run JAVAASSIST Proxy: 459 ms, 3,072,037 t/s  
  10. Run JAVAASSIST Bytecode Proxy: 71 ms, 19,860,076 t/s  
  11. Run ASM Bytecode Proxy: 72 ms, 19,584,241 t/s  
  12. ----------------  
  13. Run JDK Proxy: 298 ms, 4,731,763 t/s  
  14. Run CGLIB Proxy: 134 ms, 10,522,876 t/s  
  15. Run JAVAASSIST Proxy: 406 ms, 3,473,067 t/s  
  16. Run JAVAASSIST Bytecode Proxy: 67 ms, 21,045,752 t/s  
  17. Run ASM Bytecode Proxy: 66 ms, 21,364,627 t/s  
  18. ----------------  
  19. Run JDK Proxy: 282 ms, 5,000,231 t/s  
  20. Run CGLIB Proxy: 133 ms, 10,601,995 t/s  
  21. Run JAVAASSIST Proxy: 406 ms, 3,473,067 t/s  
  22. Run JAVAASSIST Bytecode Proxy: 67 ms, 21,045,752 t/s  
  23. Run ASM Bytecode Proxy: 67 ms, 21,045,752 t/s  
  24. ----------------  



(二) 测试结论:
1. ASM和JAVAASSIST字节码生成方式不相上下,都很快,是CGLIB的5倍。
2. CGLIB次之,是JDK自带的两倍。
3. JDK自带的再次之,因JDK1.6对动态代理做了优化,如果用低版本JDK更慢,要注意的是JDK也是通过字节码生成来实现动态代理的,而不是反射。
4. JAVAASSIST提供者动态代理接口最慢,比JDK自带的还慢。
(这也是为什么网上有人说JAVAASSIST比JDK还慢的原因,用JAVAASSIST最好别用它提供的动态代理接口,而可以考虑用它的字节码生成方式)

(三) 差异原因:
各方案生成的字节码不一样,
像JDK和CGLIB都考虑了很多因素,以及继承或包装了自己的一些类,
所以生成的字节码非常大,而我们很多时候用不上这些,
而手工生成的字节码非常小,所以速度快,
具体的字节码对比,后面有贴出,可自行分析。

(四) 最终选型:
最终决定使用JAVAASSIST的字节码生成代理方式,
虽然ASM稍快,但并没有快一个数量级,
而JAVAASSIST的字节码生成方式比ASM方便,
JAVAASSIST只需用字符串拼接出Java源码,便可生成相应字节码,
而ASM需要手工写字节码。

(五) 测试代码:

Java代码  收藏代码
  1. public interface CountService {  
  2.   
  3.     int count();  
  4.   
  5. }  


Java代码  收藏代码
  1. public class CountServiceImpl implements CountService {  
  2.   
  3.     private int count = 0;  
  4.   
  5.     public int count() {  
  6.         return count ++;  
  7.     }  
  8. }  


Java代码  收藏代码
  1. import java.lang.reflect.Field;  
  2. import java.lang.reflect.InvocationHandler;  
  3. import java.lang.reflect.Method;  
  4. import java.lang.reflect.Proxy;  
  5. import java.text.DecimalFormat;  
  6.   
  7. import javassist.ClassPool;  
  8. import javassist.CtClass;  
  9. import javassist.CtField;  
  10. import javassist.CtNewConstructor;  
  11. import javassist.CtNewMethod;  
  12. import javassist.util.proxy.MethodHandler;  
  13. import javassist.util.proxy.ProxyFactory;  
  14. import javassist.util.proxy.ProxyObject;  
  15. import net.sf.cglib.proxy.Enhancer;  
  16. import net.sf.cglib.proxy.MethodInterceptor;  
  17. import net.sf.cglib.proxy.MethodProxy;  
  18.   
  19. import org.objectweb.asm.ClassWriter;  
  20. import org.objectweb.asm.FieldVisitor;  
  21. import org.objectweb.asm.MethodVisitor;  
  22. import org.objectweb.asm.Opcodes;  
  23.   
  24. public class DynamicProxyPerformanceTest {  
  25.   
  26.     public static void main(String[] args) throws Exception {  
  27.         CountService delegate = new CountServiceImpl();  
  28.           
  29.         long time = System.currentTimeMillis();  
  30.         CountService jdkProxy = createJdkDynamicProxy(delegate);  
  31.         time = System.currentTimeMillis() - time;  
  32.         System.out.println("Create JDK Proxy: " + time + " ms");  
  33.           
  34.         time = System.currentTimeMillis();  
  35.         CountService cglibProxy = createCglibDynamicProxy(delegate);  
  36.         time = System.currentTimeMillis() - time;  
  37.         System.out.println("Create CGLIB Proxy: " + time + " ms");  
  38.           
  39.         time = System.currentTimeMillis();  
  40.         CountService javassistProxy = createJavassistDynamicProxy(delegate);  
  41.         time = System.currentTimeMillis() - time;  
  42.         System.out.println("Create JAVAASSIST Proxy: " + time + " ms");  
  43.           
  44.         time = System.currentTimeMillis();  
  45.         CountService javassistBytecodeProxy = createJavassistBytecodeDynamicProxy(delegate);  
  46.         time = System.currentTimeMillis() - time;  
  47.         System.out.println("Create JAVAASSIST Bytecode Proxy: " + time + " ms");  
  48.           
  49.         time = System.currentTimeMillis();  
  50.         CountService asmBytecodeProxy = createAsmBytecodeDynamicProxy(delegate);  
  51.         time = System.currentTimeMillis() - time;  
  52.         System.out.println("Create ASM Proxy: " + time + " ms");  
  53.         System.out.println("================");  
  54.           
  55.         for (int i = 0; i < 3; i++) {  
  56.             test(jdkProxy, "Run JDK Proxy: ");  
  57.             test(cglibProxy, "Run CGLIB Proxy: ");  
  58.             test(javassistProxy, "Run JAVAASSIST Proxy: ");  
  59.             test(javassistBytecodeProxy, "Run JAVAASSIST Bytecode Proxy: ");  
  60.             test(asmBytecodeProxy, "Run ASM Bytecode Proxy: ");  
  61.             System.out.println("----------------");  
  62.         }  
  63.     }  
  64.   
  65.     private static void test(CountService service, String label)  
  66.             throws Exception {  
  67.         service.count(); // warm up  
  68.         int count = 10000000;  
  69.         long time = System.currentTimeMillis();  
  70.         for (int i = 0; i < count; i++) {  
  71.             service.count();  
  72.         }  
  73.         time = System.currentTimeMillis() - time;  
  74.         System.out.println(label + time + " ms, " + new DecimalFormat().format(count * 1000 / time) + " t/s");  
  75.     }  
  76.   
  77.     private static CountService createJdkDynamicProxy(final CountService delegate) {  
  78.         CountService jdkProxy = (CountService) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),  
  79.                 new Class[] { CountService.class }, new JdkHandler(delegate));  
  80.         return jdkProxy;  
  81.     }  
  82.       
  83.     private static class JdkHandler implements InvocationHandler {  
  84.   
  85.         final Object delegate;  
  86.   
  87.         JdkHandler(Object delegate) {  
  88.             this.delegate = delegate;  
  89.         }  
  90.   
  91.         public Object invoke(Object object, Method method, Object[] objects)  
  92.                 throws Throwable {  
  93.             return method.invoke(delegate, objects);  
  94.         }  
  95.     }  
  96.   
  97.     private static CountService createCglibDynamicProxy(final CountService delegate) throws Exception {  
  98.         Enhancer enhancer = new Enhancer();  
  99.         enhancer.setCallback(new CglibInterceptor(delegate));  
  100.         enhancer.setInterfaces(new Class[] { CountService.class });  
  101.         CountService cglibProxy = (CountService) enhancer.create();  
  102.         return cglibProxy;  
  103.     }  
  104.   
  105.     private static class CglibInterceptor implements MethodInterceptor {  
  106.           
  107.         final Object delegate;  
  108.   
  109.         CglibInterceptor(Object delegate) {  
  110.             this.delegate = delegate;  
  111.         }  
  112.   
  113.         public Object intercept(Object object, Method method, Object[] objects,  
  114.                 MethodProxy methodProxy) throws Throwable {  
  115.             return methodProxy.invoke(delegate, objects);  
  116.         }  
  117.     }  
  118.   
  119.     private static CountService createJavassistDynamicProxy(final CountService delegate) throws Exception {  
  120.         ProxyFactory proxyFactory = new ProxyFactory();  
  121.         proxyFactory.setInterfaces(new Class[] { CountService.class });  
  122.         Class<?> proxyClass = proxyFactory.createClass();  
  123.         CountService javassistProxy = (CountService) proxyClass.newInstance();  
  124.         ((ProxyObject) javassistProxy).setHandler(new JavaAssitInterceptor(delegate));  
  125.         return javassistProxy;  
  126.     }  
  127.   
  128.     private static class JavaAssitInterceptor implements MethodHandler {  
  129.   
  130.         final Object delegate;  
  131.   
  132.         JavaAssitInterceptor(Object delegate) {  
  133.             this.delegate = delegate;  
  134.         }  
  135.   
  136.         public Object invoke(Object self, Method m, Method proceed,  
  137.                 Object[] args) throws Throwable {  
  138.             return m.invoke(delegate, args);  
  139.         }  
  140.     }  
  141.   
  142.     private static CountService createJavassistBytecodeDynamicProxy(CountService delegate) throws Exception {  
  143.         ClassPool mPool = new ClassPool(true);  
  144.         CtClass mCtc = mPool.makeClass(CountService.class.getName() + "JavaassistProxy");  
  145.         mCtc.addInterface(mPool.get(CountService.class.getName()));  
  146.         mCtc.addConstructor(CtNewConstructor.defaultConstructor(mCtc));  
  147.         mCtc.addField(CtField.make("public " + CountService.class.getName() + " delegate;", mCtc));  
  148.         mCtc.addMethod(CtNewMethod.make("public int count() { return delegate.count(); }", mCtc));  
  149.         Class<?> pc = mCtc.toClass();  
  150.         CountService bytecodeProxy = (CountService) pc.newInstance();  
  151.         Field filed = bytecodeProxy.getClass().getField("delegate");  
  152.         filed.set(bytecodeProxy, delegate);  
  153.         return bytecodeProxy;  
  154.     }  
  155.       
  156.     private static CountService createAsmBytecodeDynamicProxy(CountService delegate) throws Exception {  
  157.         ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);  
  158.         String className = CountService.class.getName() +  "AsmProxy";  
  159.         String classPath = className.replace('.', '/');  
  160.         String interfacePath = CountService.class.getName().replace('.', '/');  
  161.         classWriter.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, classPath, null, "java/lang/Object", new String[] {interfacePath});  
  162.           
  163.         MethodVisitor initVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);  
  164.         initVisitor.visitCode();  
  165.         initVisitor.visitVarInsn(Opcodes.ALOAD, 0);  
  166.         initVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");  
  167.         initVisitor.visitInsn(Opcodes.RETURN);  
  168.         initVisitor.visitMaxs(0, 0);  
  169.         initVisitor.visitEnd();  
  170.           
  171.         FieldVisitor fieldVisitor = classWriter.visitField(Opcodes.ACC_PUBLIC, "delegate", "L" + interfacePath + ";", null, null);  
  172.         fieldVisitor.visitEnd();  
  173.           
  174.         MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "count", "()I", null, null);  
  175.         methodVisitor.visitCode();  
  176.         methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);  
  177.         methodVisitor.visitFieldInsn(Opcodes.GETFIELD, classPath, "delegate", "L" + interfacePath + ";");  
  178.         methodVisitor.visitMethodInsn(Opcodes.INVOKEINTERFACE, interfacePath, "count", "()I");  
  179.         methodVisitor.visitInsn(Opcodes.IRETURN);  
  180.         methodVisitor.visitMaxs(0, 0);  
  181.         methodVisitor.visitEnd();  
  182.           
  183.         classWriter.visitEnd();  
  184.         byte[] code = classWriter.toByteArray();  
  185.         CountService bytecodeProxy = (CountService) new ByteArrayClassLoader().getClass(className, code).newInstance();  
  186.         Field filed = bytecodeProxy.getClass().getField("delegate");  
  187.         filed.set(bytecodeProxy, delegate);  
  188.         return bytecodeProxy;  
  189.     }  
  190.       
  191.     private static class ByteArrayClassLoader extends ClassLoader {  
  192.   
  193.         public ByteArrayClassLoader() {  
  194.             super(ByteArrayClassLoader.class.getClassLoader());  
  195.         }  
  196.   
  197.         public synchronized Class<?> getClass(String name, byte[] code) {  
  198.             if (name == null) {  
  199.                 throw new IllegalArgumentException("");  
  200.             }  
  201.             return defineClass(name, code, 0, code.length);  
  202.         }  
  203.   
  204.     }  
  205. }  



(六) 字节码对比

(1) JDK生成的字节码:

Java代码  收藏代码
  1. public final class $Proxy0 extends java.lang.reflect.Proxy implements com.alibaba.test.performance.dynamicproxy.CountService{  
  2. public $Proxy0(java.lang.reflect.InvocationHandler)   throws ;  
  3.   Code:  
  4.    0:   aload_0  
  5.    1:   aload_1  
  6.    2:   invokespecial   #8; //Method java/lang/reflect/Proxy."":(Ljava/lang/reflect/InvocationHandler;)V  
  7.    5:   return  
  8.   
  9. public final boolean equals(java.lang.Object)   throws ;  
  10.   Code:  
  11.    0:   aload_0  
  12.    1:   getfield    #16; //Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;  
  13.    4:   aload_0  
  14.    5:   getstatic   #20; //Field m1:Ljava/lang/reflect/Method;  
  15.    8:   iconst_1  
  16.    9:   anewarray   #22; //class java/lang/Object  
  17.    12:  dup  
  18.    13:  iconst_0  
  19.    14:  aload_1  
  20.    15:  aastore  
  21.    16:  invokeinterface #28,  4; //InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  22.    21:  checkcast   #30; //class java/lang/Boolean  
  23.    24:  invokevirtual   #34; //Method java/lang/Boolean.booleanValue:()Z  
  24.    27:  ireturn  
  25.    28:  athrow  
  26.    29:  astore_2  
  27.    30:  new #42; //class java/lang/reflect/UndeclaredThrowableException  
  28.    33:  dup  
  29.    34:  aload_2  
  30.    35:  invokespecial   #45; //Method java/lang/reflect/UndeclaredThrowableException."":(Ljava/lang/Throwable;)V  
  31.    38:  athrow  
  32.   Exception table:  
  33.    from   to  target type  
  34.      0    28    28   Class java/lang/Error  
  35.   
  36.      0    28    28   Class java/lang/RuntimeException  
  37.   
  38.      0    28    29   Class java/lang/Throwable  
  39.   
  40.   
  41. public final int count()   throws ;  
  42.   Code:  
  43.    0:   aload_0  
  44.    1:   getfield    #16; //Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;  
  45.    4:   aload_0  
  46.    5:   getstatic   #50; //Field m3:Ljava/lang/reflect/Method;  
  47.    8:   aconst_null  
  48.    9:   invokeinterface #28,  4; //InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  49.    14:  checkcast   #52; //class java/lang/Integer  
  50.    17:  invokevirtual   #55; //Method java/lang/Integer.intValue:()I  
  51.    20:  ireturn  
  52.    21:  athrow  
  53.    22:  astore_1  
  54.    23:  new #42; //class java/lang/reflect/UndeclaredThrowableException  
  55.    26:  dup  
  56.    27:  aload_1  
  57.    28:  invokespecial   #45; //Method java/lang/reflect/UndeclaredThrowableException."":(Ljava/lang/Throwable;)V  
  58.    31:  athrow  
  59.   Exception table:  
  60.    from   to  target type  
  61.      0    21    21   Class java/lang/Error  
  62.   
  63.      0    21    21   Class java/lang/RuntimeException  
  64.   
  65.      0    21    22   Class java/lang/Throwable  
  66.   
  67.   
  68. public final int hashCode()   throws ;  
  69.   Code:  
  70.    0:   aload_0  
  71.    1:   getfield    #16; //Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;  
  72.    4:   aload_0  
  73.    5:   getstatic   #59; //Field m0:Ljava/lang/reflect/Method;  
  74.    8:   aconst_null  
  75.    9:   invokeinterface #28,  4; //InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  76.    14:  checkcast   #52; //class java/lang/Integer  
  77.    17:  invokevirtual   #55; //Method java/lang/Integer.intValue:()I  
  78.    20:  ireturn  
  79.    21:  athrow  
  80.    22:  astore_1  
  81.    23:  new #42; //class java/lang/reflect/UndeclaredThrowableException  
  82.    26:  dup  
  83.    27:  aload_1  
  84.    28:  invokespecial   #45; //Method java/lang/reflect/UndeclaredThrowableException."":(Ljava/lang/Throwable;)V  
  85.    31:  athrow  
  86.   Exception table:  
  87.    from   to  target type  
  88.      0    21    21   Class java/lang/Error  
  89.   
  90.      0    21    21   Class java/lang/RuntimeException  
  91.   
  92.      0    21    22   Class java/lang/Throwable  
  93.   
  94.   
  95. public final java.lang.String toString()   throws ;  
  96.   Code:  
  97.    0:   aload_0  
  98.    1:   getfield    #16; //Field java/lang/reflect/Proxy.h:Ljava/lang/reflect/InvocationHandler;  
  99.    4:   aload_0  
  100.    5:   getstatic   #64; //Field m2:Ljava/lang/reflect/Method;  
  101.    8:   aconst_null  
  102.    9:   invokeinterface #28,  4; //InterfaceMethod java/lang/reflect/InvocationHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  103.    14:  checkcast   #66; //class java/lang/String  
  104.    17:  areturn  
  105.    18:  athrow  
  106.    19:  astore_1  
  107.    20:  new #42; //class java/lang/reflect/UndeclaredThrowableException  
  108.    23:  dup  
  109.    24:  aload_1  
  110.    25:  invokespecial   #45; //Method java/lang/reflect/UndeclaredThrowableException."":(Ljava/lang/Throwable;)V  
  111.    28:  athrow  
  112.   Exception table:  
  113.    from   to  target type  
  114.      0    18    18   Class java/lang/Error  
  115.   
  116.      0    18    18   Class java/lang/RuntimeException  
  117.   
  118.      0    18    19   Class java/lang/Throwable  
  119.   
  120.   
  121. static {}   throws ;  
  122.   Code:  
  123.    0:   ldc #70; //String java.lang.Object  
  124.    2:   invokestatic    #76; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;  
  125.    5:   ldc #77; //String equals  
  126.    7:   iconst_1  
  127.    8:   anewarray   #72; //class java/lang/Class  
  128.    11:  dup  
  129.    12:  iconst_0  
  130.    13:  ldc #70; //String java.lang.Object  
  131.    15:  invokestatic    #76; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;  
  132.    18:  aastore  
  133.    19:  invokevirtual   #81; //Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;  
  134.    22:  putstatic   #20; //Field m1:Ljava/lang/reflect/Method;  
  135.    25:  ldc #83; //String com.alibaba.test.performance.dynamicproxy.CountService  
  136.    27:  invokestatic    #76; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;  
  137.    30:  ldc #84; //String count  
  138.    32:  iconst_0  
  139.    33:  anewarray   #72; //class java/lang/Class  
  140.    36:  invokevirtual   #81; //Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;  
  141.    39:  putstatic   #50; //Field m3:Ljava/lang/reflect/Method;  
  142.    42:  ldc #70; //String java.lang.Object  
  143.    44:  invokestatic    #76; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;  
  144.    47:  ldc #85; //String hashCode  
  145.    49:  iconst_0  
  146.    50:  anewarray   #72; //class java/lang/Class  
  147.    53:  invokevirtual   #81; //Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;  
  148.    56:  putstatic   #59; //Field m0:Ljava/lang/reflect/Method;  
  149.    59:  ldc #70; //String java.lang.Object  
  150.    61:  invokestatic    #76; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;  
  151.    64:  ldc #86; //String toString  
  152.    66:  iconst_0  
  153.    67:  anewarray   #72; //class java/lang/Class  
  154.    70:  invokevirtual   #81; //Method java/lang/Class.getMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;  
  155.    73:  putstatic   #64; //Field m2:Ljava/lang/reflect/Method;  
  156.    76:  return  
  157.    77:  astore_1  
  158.    78:  new #90; //class java/lang/NoSuchMethodError  
  159.    81:  dup  
  160.    82:  aload_1  
  161.    83:  invokevirtual   #93; //Method java/lang/Throwable.getMessage:()Ljava/lang/String;  
  162.    86:  invokespecial   #96; //Method java/lang/NoSuchMethodError."":(Ljava/lang/String;)V  
  163.    89:  athrow  
  164.    90:  astore_1  
  165.    91:  new #100; //class java/lang/NoClassDefFoundError  
  166.    94:  dup  
  167.    95:  aload_1  
  168.    96:  invokevirtual   #93; //Method java/lang/Throwable.getMessage:()Ljava/lang/String;  
  169.    99:  invokespecial   #101; //Method java/lang/NoClassDefFoundError."":(Ljava/lang/String;)V  
  170.    102: athrow  
  171.   Exception table:  
  172.    from   to  target type  
  173.      0    77    77   Class java/lang/NoSuchMethodException  
  174.   
  175.      0    77    90   Class java/lang/ClassNotFoundException  
  176.   
  177.   
  178. }  



(2) CGLIB生成的字节码:

Java代码  收藏代码
  1. public class net.sf.cglib.core.MethodWrapper$MethodWrapperKey$$KeyFactoryByCGLIB$$d45e49f7 extends net.sf.cglib.core.KeyFactory implements net.sf.cglib.core.MethodWrapper$MethodWrapperKey{  
  2. public net.sf.cglib.core.MethodWrapper$MethodWrapperKey$$KeyFactoryByCGLIB$$d45e49f7();  
  3.   Code:  
  4.    0:   aload_0  
  5.    1:   invokespecial   #11; //Method net/sf/cglib/core/KeyFactory."":()V  
  6.    4:   return  
  7.   
  8. public java.lang.Object newInstance(java.lang.String, java.lang.String[], java.lang.String);  
  9.   Code:  
  10.    0:   new #2; //class net/sf/cglib/core/MethodWrapper$MethodWrapperKey$$KeyFactoryByCGLIB$$d45e49f7  
  11.    3:   dup  
  12.    4:   aload_1  
  13.    5:   aload_2  
  14.    6:   aload_3  
  15.    7:   invokespecial   #16; //Method "":(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V  
  16.    10:  areturn  
  17.   
  18. public net.sf.cglib.core.MethodWrapper$MethodWrapperKey$$KeyFactoryByCGLIB$$d45e49f7(java.lang.String, java.lang.String[], java.lang.String);  
  19.   Code:  
  20.    0:   aload_0  
  21.    1:   invokespecial   #11; //Method net/sf/cglib/core/KeyFactory."":()V  
  22.    4:   aload_0  
  23.    5:   dup  
  24.    6:   aload_1  
  25.    7:   putfield    #20; //Field FIELD_0:Ljava/lang/String;  
  26.    10:  dup  
  27.    11:  aload_2  
  28.    12:  putfield    #24; //Field FIELD_1:[Ljava/lang/String;  
  29.    15:  dup  
  30.    16:  aload_3  
  31.    17:  putfield    #27; //Field FIELD_2:Ljava/lang/String;  
  32.    20:  return  
  33.   
  34. public int hashCode();  
  35.   Code:  
  36.    0:   ldc #30; //int 938313161  
  37.    2:   aload_0  
  38.    3:   getfield    #20; //Field FIELD_0:Ljava/lang/String;  
  39.    6:   swap  
  40.    7:   ldc #31; //int 362693231  
  41.    9:   imul  
  42.    10:  swap  
  43.    11:  dup  
  44.    12:  ifnull  21  
  45.    15:  invokevirtual   #35; //Method java/lang/Object.hashCode:()I  
  46.    18:  goto    23  
  47.    21:  pop  
  48.    22:  iconst_0  
  49.    23:  iadd  
  50.    24:  aload_0  
  51.    25:  getfield    #24; //Field FIELD_1:[Ljava/lang/String;  
  52.    28:  dup  
  53.    29:  ifnull  71  
  54.    32:  astore_1  
  55.    33:  iconst_0  
  56.    34:  istore_2  
  57.    35:  goto    62  
  58.    38:  aload_1  
  59.    39:  iload_2  
  60.    40:  aaload  
  61.    41:  swap  
  62.    42:  ldc #31; //int 362693231  
  63.    44:  imul  
  64.    45:  swap  
  65.    46:  dup  
  66.    47:  ifnull  56  
  67.    50:  invokevirtual   #35; //Method java/lang/Object.hashCode:()I  
  68.    53:  goto    58  
  69.    56:  pop  
  70.    57:  iconst_0  
  71.    58:  iadd  
  72.    59:  iinc    2, 1  
  73.    62:  iload_2  
  74.    63:  aload_1  
  75.    64:  arraylength  
  76.    65:  if_icmplt   38  
  77.    68:  goto    72  
  78.    71:  pop  
  79.    72:  aload_0  
  80.    73:  getfield    #27; //Field FIELD_2:Ljava/lang/String;  
  81.    76:  swap  
  82.    77:  ldc #31; //int 362693231  
  83.    79:  imul  
  84.    80:  swap  
  85.    81:  dup  
  86.    82:  ifnull  91  
  87.    85:  invokevirtual   #35; //Method java/lang/Object.hashCode:()I  
  88.    88:  goto    93  
  89.    91:  pop  
  90.    92:  iconst_0  
  91.    93:  iadd  
  92.    94:  ireturn  
  93.   
  94. public boolean equals(java.lang.Object);  
  95.   Code:  
  96.    0:   aload_1  
  97.    1:   instanceof  #2; //class net/sf/cglib/core/MethodWrapper$MethodWrapperKey$$KeyFactoryByCGLIB$$d45e49f7  
  98.    4:   ifeq    181  
  99.    7:   aload_0  
  100.    8:   getfield    #20; //Field FIELD_0:Ljava/lang/String;  
  101.    11:  aload_1  
  102.    12:  checkcast   #2; //class net/sf/cglib/core/MethodWrapper$MethodWrapperKey$$KeyFactoryByCGLIB$$d45e49f7  
  103.    15:  getfield    #20; //Field FIELD_0:Ljava/lang/String;  
  104.    18:  dup2  
  105.    19:  ifnonnull   29  
  106.    22:  ifnonnull   35  
  107.    25:  pop2  
  108.    26:  goto    45  
  109.    29:  ifnull  35  
  110.    32:  goto    39  
  111.    35:  pop2  
  112.    36:  goto    181  
  113.    39:  invokevirtual   #39; //Method java/lang/Object.equals:(Ljava/lang/Object;)Z  
  114.    42:  ifeq    181  
  115.    45:  aload_0  
  116.    46:  getfield    #24; //Field FIELD_1:[Ljava/lang/String;  
  117.    49:  aload_1  
  118.    50:  checkcast   #2; //class net/sf/cglib/core/MethodWrapper$MethodWrapperKey$$KeyFactoryByCGLIB$$d45e49f7  
  119.    53:  getfield    #24; //Field FIELD_1:[Ljava/lang/String;  
  120.    56:  dup2  
  121.    57:  ifnonnull   67  
  122.    60:  ifnonnull   73  
  123.    63:  pop2  
  124.    64:  goto    141  
  125.    67:  ifnull  73  
  126.    70:  goto    77  
  127.    73:  pop2  
  128.    74:  goto    181  
  129.    77:  dup2  
  130.    78:  arraylength  
  131.    79:  swap  
  132.    80:  arraylength  
  133.    81:  if_icmpeq   88  
  134.    84:  pop2  
  135.    85:  goto    181  
  136.    88:  astore_2  
  137.    89:  astore_3  
  138.    90:  iconst_0  
  139.    91:  istore  4  
  140.    93:  goto    134  
  141.    96:  aload_2  
  142.    97:  iload   4  
  143.    99:  aaload  
  144.    100: aload_3  
  145.    101: iload   4  
  146.    103: aaload  
  147.    104: dup2  
  148.    105: ifnonnull   115  
  149.    108: ifnonnull   121  
  150.    111: pop2  
  151.    112: goto    131  
  152.    115: ifnull  121  
  153.    118: goto    125  
  154.    121: pop2  
  155.    122: goto    181  
  156.    125: invokevirtual   #39; //Method java/lang/Object.equals:(Ljava/lang/Object;)Z  
  157.    128: ifeq    181  
  158.    131: iinc    4, 1  
  159.    134: iload   4  
  160.    136: aload_2  
  161.    137: arraylength  
  162.    138: if_icmplt   96  
  163.    141: aload_0  
  164.    142: getfield    #27; //Field FIELD_2:Ljava/lang/String;  
  165.    145: aload_1  
  166.    146: checkcast   #2; //class net/sf/cglib/core/MethodWrapper$MethodWrapperKey$$KeyFactoryByCGLIB$$d45e49f7  
  167.    149: getfield    #27; //Field FIELD_2:Ljava/lang/String;  
  168.    152: dup2  
  169.    153: ifnonnull   163  
  170.    156: ifnonnull   169  
  171.    159: pop2  
  172.    160: goto    179  
  173.    163: ifnull  169  
  174.    166: goto    173  
  175.    169: pop2  
  176.    170: goto    181  
  177.    173: invokevirtual   #39; //Method java/lang/Object.equals:(Ljava/lang/Object;)Z  
  178.    176: ifeq    181  
  179.    179: iconst_1  
  180.    180: ireturn  
  181.    181: iconst_0  
  182.    182: ireturn  
  183.   
  184. public java.lang.String toString();  
  185.   Code:  
  186.    0:   new #43; //class java/lang/StringBuffer  
  187.    3:   dup  
  188.    4:   invokespecial   #44; //Method java/lang/StringBuffer."":()V  
  189.    7:   aload_0  
  190.    8:   getfield    #20; //Field FIELD_0:Ljava/lang/String;  
  191.    11:  dup  
  192.    12:  ifnull  24  
  193.    15:  invokevirtual   #46; //Method java/lang/Object.toString:()Ljava/lang/String;  
  194.    18:  invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  195.    21:  goto    30  
  196.    24:  pop  
  197.    25:  ldc #52; //String null  
  198.    27:  invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  199.    30:  ldc #54; //String ,   
  200.    32:  invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  201.    35:  aload_0  
  202.    36:  getfield    #24; //Field FIELD_1:[Ljava/lang/String;  
  203.    39:  dup  
  204.    40:  ifnull  110  
  205.    43:  swap  
  206.    44:  ldc #56; //String {  
  207.    46:  invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  208.    49:  swap  
  209.    50:  astore_1  
  210.    51:  iconst_0  
  211.    52:  istore_2  
  212.    53:  goto    86  
  213.    56:  aload_1  
  214.    57:  iload_2  
  215.    58:  aaload  
  216.    59:  dup  
  217.    60:  ifnull  72  
  218.    63:  invokevirtual   #46; //Method java/lang/Object.toString:()Ljava/lang/String;  
  219.    66:  invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  220.    69:  goto    78  
  221.    72:  pop  
  222.    73:  ldc #52; //String null  
  223.    75:  invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  224.    78:  ldc #54; //String ,   
  225.    80:  invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  226.    83:  iinc    2, 1  
  227.    86:  iload_2  
  228.    87:  aload_1  
  229.    88:  arraylength  
  230.    89:  if_icmplt   56  
  231.    92:  dup  
  232.    93:  dup  
  233.    94:  invokevirtual   #59; //Method java/lang/StringBuffer.length:()I  
  234.    97:  iconst_2  
  235.    98:  isub  
  236.    99:  invokevirtual   #63; //Method java/lang/StringBuffer.setLength:(I)V  
  237.    102: ldc #65; //String }  
  238.    104: invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  239.    107: goto    116  
  240.    110: pop  
  241.    111: ldc #52; //String null  
  242.    113: invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  243.    116: ldc #54; //String ,   
  244.    118: invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  245.    121: aload_0  
  246.    122: getfield    #27; //Field FIELD_2:Ljava/lang/String;  
  247.    125: dup  
  248.    126: ifnull  138  
  249.    129: invokevirtual   #46; //Method java/lang/Object.toString:()Ljava/lang/String;  
  250.    132: invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  251.    135: goto    144  
  252.    138: pop  
  253.    139: ldc #52; //String null  
  254.    141: invokevirtual   #50; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;  
  255.    144: invokevirtual   #66; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;  
  256.    147: areturn  
  257.   
  258. }  



(3) JAVAASSIST动态代理接口生成的字节码:

Java代码  收藏代码
  1. public class com.alibaba.test.performance.dynamicproxy.CountService_$$_javassist_0 extends java.lang.Object implements com.alibaba.test.performance.dynamicproxy.CountService,javassist.util.proxy.ProxyObject{  
  2. public static javassist.util.proxy.MethodHandler default_interceptor;  
  3.   
  4. public static javassist.util.proxy.MethodFilter _method_filter;  
  5.   
  6. public com.alibaba.test.performance.dynamicproxy.CountService_$$_javassist_0();  
  7.   Code:  
  8.    0:   aload_0  
  9.    1:   getstatic   #19; //Field default_interceptor:Ljavassist/util/proxy/MethodHandler;  
  10.    4:   putfield    #21; //Field handler:Ljavassist/util/proxy/MethodHandler;  
  11.    7:   getstatic   #23; //Field default_interceptor:Ljavassist/util/proxy/MethodHandler;  
  12.    10:  ifnonnull   20  
  13.    13:  aload_0  
  14.    14:  getstatic   #27; //Field javassist/util/proxy/RuntimeSupport.default_interceptor:Ljavassist/util/proxy/MethodHandler;  
  15.    17:  putfield    #29; //Field handler:Ljavassist/util/proxy/MethodHandler;  
  16.    20:  aload_0  
  17.    21:  invokespecial   #31; //Method java/lang/Object."":()V  
  18.    24:  return  
  19.   
  20. public final boolean _d0equals(java.lang.Object);  
  21.   Code:  
  22.    0:   aload_0  
  23.    1:   aload_1  
  24.    2:   invokespecial   #38; //Method java/lang/Object.equals:(Ljava/lang/Object;)Z  
  25.    5:   ireturn  
  26.   
  27. public final boolean equals(java.lang.Object);  
  28.   Code:  
  29.    0:   getstatic   #42; //Field _methods_:[Ljava/lang/reflect/Method;  
  30.    3:   astore_2  
  31.    4:   aload_0  
  32.    5:   ldc #43; //String equals  
  33.    7:   ldc #44; //String _d0equals  
  34.    9:   iconst_0  
  35.    10:  ldc #45; //String (Ljava/lang/Object;)Z  
  36.    12:  aload_2  
  37.    13:  invokestatic    #49; //Method javassist/util/proxy/RuntimeSupport.find2Methods:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/reflect/Method;)V  
  38.    16:  aload_0  
  39.    17:  getfield    #51; //Field handler:Ljavassist/util/proxy/MethodHandler;  
  40.    20:  aload_0  
  41.    21:  aload_2  
  42.    22:  iconst_0  
  43.    23:  aaload  
  44.    24:  aload_2  
  45.    25:  iconst_1  
  46.    26:  aaload  
  47.    27:  iconst_1  
  48.    28:  anewarray   #52; //class java/lang/Object  
  49.    31:  dup  
  50.    32:  iconst_0  
  51.    33:  aload_1  
  52.    34:  aastore  
  53.    35:  invokeinterface #58,  5; //InterfaceMethod javassist/util/proxy/MethodHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  54.    40:  checkcast   #60; //class java/lang/Boolean  
  55.    43:  invokevirtual   #64; //Method java/lang/Boolean.booleanValue:()Z  
  56.    46:  ireturn  
  57.   
  58. public final java.lang.Object _d1clone()   throws java.lang.CloneNotSupportedException;  
  59.   Code:  
  60.    0:   aload_0  
  61.    1:   invokespecial   #72; //Method java/lang/Object.clone:()Ljava/lang/Object;  
  62.    4:   areturn  
  63.   
  64. protected final java.lang.Object clone()   throws java.lang.CloneNotSupportedException;  
  65.   Code:  
  66.    0:   getstatic   #74; //Field _methods_:[Ljava/lang/reflect/Method;  
  67.    3:   astore_1  
  68.    4:   aload_0  
  69.    5:   ldc #75; //String clone  
  70.    7:   ldc #76; //String _d1clone  
  71.    9:   iconst_2  
  72.    10:  ldc #77; //String ()Ljava/lang/Object;  
  73.    12:  aload_1  
  74.    13:  invokestatic    #79; //Method javassist/util/proxy/RuntimeSupport.find2Methods:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/reflect/Method;)V  
  75.    16:  aload_0  
  76.    17:  getfield    #81; //Field handler:Ljavassist/util/proxy/MethodHandler;  
  77.    20:  aload_0  
  78.    21:  aload_1  
  79.    22:  iconst_2  
  80.    23:  aaload  
  81.    24:  aload_1  
  82.    25:  iconst_3  
  83.    26:  aaload  
  84.    27:  iconst_0  
  85.    28:  anewarray   #52; //class java/lang/Object  
  86.    31:  invokeinterface #83,  5; //InterfaceMethod javassist/util/proxy/MethodHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  87.    36:  checkcast   #4; //class java/lang/Object  
  88.    39:  areturn  
  89.   
  90. public final int _d2hashCode();  
  91.   Code:  
  92.    0:   aload_0  
  93.    1:   invokespecial   #88; //Method java/lang/Object.hashCode:()I  
  94.    4:   ireturn  
  95.   
  96. public final int hashCode();  
  97.   Code:  
  98.    0:   getstatic   #90; //Field _methods_:[Ljava/lang/reflect/Method;  
  99.    3:   astore_1  
  100.    4:   aload_0  
  101.    5:   ldc #91; //String hashCode  
  102.    7:   ldc #92; //String _d2hashCode  
  103.    9:   iconst_4  
  104.    10:  ldc #93; //String ()I  
  105.    12:  aload_1  
  106.    13:  invokestatic    #95; //Method javassist/util/proxy/RuntimeSupport.find2Methods:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/reflect/Method;)V  
  107.    16:  aload_0  
  108.    17:  getfield    #97; //Field handler:Ljavassist/util/proxy/MethodHandler;  
  109.    20:  aload_0  
  110.    21:  aload_1  
  111.    22:  iconst_4  
  112.    23:  aaload  
  113.    24:  aload_1  
  114.    25:  iconst_5  
  115.    26:  aaload  
  116.    27:  iconst_0  
  117.    28:  anewarray   #52; //class java/lang/Object  
  118.    31:  invokeinterface #99,  5; //InterfaceMethod javassist/util/proxy/MethodHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  119.    36:  checkcast   #101; //class java/lang/Integer  
  120.    39:  invokevirtual   #104; //Method java/lang/Integer.intValue:()I  
  121.    42:  ireturn  
  122.   
  123. public final int count();  
  124.   Code:  
  125.    0:   getstatic   #107; //Field _methods_:[Ljava/lang/reflect/Method;  
  126.    3:   astore_1  
  127.    4:   aload_0  
  128.    5:   ldc #108; //String count  
  129.    7:   aconst_null  
  130.    8:   bipush  6  
  131.    10:  ldc #109; //String ()I  
  132.    12:  aload_1  
  133.    13:  invokestatic    #111; //Method javassist/util/proxy/RuntimeSupport.find2Methods:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/reflect/Method;)V  
  134.    16:  aload_0  
  135.    17:  getfield    #113; //Field handler:Ljavassist/util/proxy/MethodHandler;  
  136.    20:  aload_0  
  137.    21:  aload_1  
  138.    22:  bipush  6  
  139.    24:  aaload  
  140.    25:  aload_1  
  141.    26:  bipush  7  
  142.    28:  aaload  
  143.    29:  iconst_0  
  144.    30:  anewarray   #52; //class java/lang/Object  
  145.    33:  invokeinterface #115,  5; //InterfaceMethod javassist/util/proxy/MethodHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  146.    38:  checkcast   #101; //class java/lang/Integer  
  147.    41:  invokevirtual   #117; //Method java/lang/Integer.intValue:()I  
  148.    44:  ireturn  
  149.   
  150. public final void _d4finalize()   throws java.lang.Throwable;  
  151.   Code:  
  152.    0:   aload_0  
  153.    1:   invokespecial   #123; //Method java/lang/Object.finalize:()V  
  154.    4:   return  
  155.   
  156. protected final void finalize()   throws java.lang.Throwable;  
  157.   Code:  
  158.    0:   getstatic   #125; //Field _methods_:[Ljava/lang/reflect/Method;  
  159.    3:   astore_1  
  160.    4:   aload_0  
  161.    5:   ldc #126; //String finalize  
  162.    7:   ldc #127; //String _d4finalize  
  163.    9:   bipush  8  
  164.    11:  ldc #128; //String ()V  
  165.    13:  aload_1  
  166.    14:  invokestatic    #130; //Method javassist/util/proxy/RuntimeSupport.find2Methods:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/reflect/Method;)V  
  167.    17:  aload_0  
  168.    18:  getfield    #132; //Field handler:Ljavassist/util/proxy/MethodHandler;  
  169.    21:  aload_0  
  170.    22:  aload_1  
  171.    23:  bipush  8  
  172.    25:  aaload  
  173.    26:  aload_1  
  174.    27:  bipush  9  
  175.    29:  aaload  
  176.    30:  iconst_0  
  177.    31:  anewarray   #52; //class java/lang/Object  
  178.    34:  invokeinterface #134,  5; //InterfaceMethod javassist/util/proxy/MethodHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  179.    39:  pop  
  180.    40:  return  
  181.   
  182. public final java.lang.String _d5toString();  
  183.   Code:  
  184.    0:   aload_0  
  185.    1:   invokespecial   #139; //Method java/lang/Object.toString:()Ljava/lang/String;  
  186.    4:   areturn  
  187.   
  188. public final java.lang.String toString();  
  189.   Code:  
  190.    0:   getstatic   #141; //Field _methods_:[Ljava/lang/reflect/Method;  
  191.    3:   astore_1  
  192.    4:   aload_0  
  193.    5:   ldc #142; //String toString  
  194.    7:   ldc #143; //String _d5toString  
  195.    9:   bipush  10  
  196.    11:  ldc #144; //String ()Ljava/lang/String;  
  197.    13:  aload_1  
  198.    14:  invokestatic    #146; //Method javassist/util/proxy/RuntimeSupport.find2Methods:(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/reflect/Method;)V  
  199.    17:  aload_0  
  200.    18:  getfield    #148; //Field handler:Ljavassist/util/proxy/MethodHandler;  
  201.    21:  aload_0  
  202.    22:  aload_1  
  203.    23:  bipush  10  
  204.    25:  aaload  
  205.    26:  aload_1  
  206.    27:  bipush  11  
  207.    29:  aaload  
  208.    30:  iconst_0  
  209.    31:  anewarray   #52; //class java/lang/Object  
  210.    34:  invokeinterface #150,  5; //InterfaceMethod javassist/util/proxy/MethodHandler.invoke:(Ljava/lang/Object;Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;  
  211.    39:  checkcast   #152; //class java/lang/String  
  212.    42:  areturn  
  213.   
  214. static {};  
  215.   Code:  
  216.    0:   bipush  12  
  217.    2:   anewarray   #155; //class java/lang/reflect/Method  
  218.    5:   putstatic   #157; //Field _methods_:[Ljava/lang/reflect/Method;  
  219.    8:   return  
  220.   
  221. public void setHandler(javassist.util.proxy.MethodHandler);  
  222.   Code:  
  223.    0:   aload_0  
  224.    1:   aload_1  
  225.    2:   putfield    #161; //Field handler:Ljavassist/util/proxy/MethodHandler;  
  226.    5:   return  
  227.   
  228. java.lang.Object writeReplace()   throws java.io.ObjectStreamException;  
  229.   Code:  
  230.    0:   aload_0  
  231.    1:   invokestatic    #168; //Method javassist/util/proxy/RuntimeSupport.makeSerializedProxy:(Ljava/lang/Object;)Ljavassist/util/proxy/SerializedProxy;  
  232.    4:   areturn  
  233.   
  234. }  



(5) JAVAASSIST拼接源码生成的字节码:

Java代码  收藏代码
  1. public class com.alibaba.test.performance.dynamicproxy.CountServiceJavaassistProxy extends java.lang.Object implements com.alibaba.test.performance.dynamicproxy.CountService{  
  2. public com.alibaba.test.performance.dynamicproxy.CountService delegate;  
  3.   
  4. public com.alibaba.test.performance.dynamicproxy.CountServiceJavaassistProxy();  
  5.   Code:  
  6.    0:   aload_0  
  7.    1:   invokespecial   #12; //Method java/lang/Object."":()V  
  8.    4:   return  
  9.   
  10. public int count();  
  11.   Code:  
  12.    0:   aload_0  
  13.    1:   getfield    #19; //Field delegate:Lcom/alibaba/test/performance/dynamicproxy/CountService;  
  14.    4:   invokeinterface #21,  1; //InterfaceMethod com/alibaba/test/performance/dynamicproxy/CountService.count:()I  
  15.    9:   ireturn  
  16.   
  17. }  



(6) 用ASM自行生成的字节码:

Java代码  收藏代码
    1. public class com.alibaba.test.performance.dynamicproxy.CountServiceAsmProxy extends java.lang.Object implements com.alibaba.test.performance.dynamicproxy.CountService{  
    2. public com.alibaba.test.performance.dynamicproxy.CountService delegate;  
    3.   
    4. public com.alibaba.test.performance.dynamicproxy.CountServiceAsmProxy();  
    5.   Code:  
    6.    0:   aload_0  
    7.    1:   invokespecial   #10; //Method java/lang/Object."":()V  
    8.    4:   return  
    9.   
    10. public int count();  
    11.   Code:  
    12.    0:   aload_0  
    13.    1:   getfield    #16; //Field delegate:Lcom/alibaba/test/performance/dynamicproxy/CountService;  
    14.    4:   invokeinterface #18,  1; //InterfaceMethod com/alibaba/test/performance/dynamicproxy/CountService.count:()I  
    15.    9:   ireturn  
    16.   
posted on 2017-09-18 18:04  devilwind  阅读(354)  评论(0编辑  收藏  举报