`

动态代理方案性能对比

 
阅读更多

转载:http://javatar.iteye.com/blog/814426

因服务框架需要用动态代理生成客户端接口的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"nullnull);  
  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(00);  
  169.         initVisitor.visitEnd();  
  170.           
  171.         FieldVisitor fieldVisitor = classWriter.visitField(Opcodes.ACC_PUBLIC, "delegate""L" + interfacePath + ";"nullnull);  
  172.         fieldVisitor.visitEnd();  
  173.           
  174.         MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "count""()I"nullnull);  
  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(00);  
  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    21  
  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.    112goto    131  
  152.    115: ifnull  121  
  153.    118goto    125  
  154.    121: pop2  
  155.    122goto    181  
  156.    125: invokevirtual   #39//Method java/lang/Object.equals:(Ljava/lang/Object;)Z  
  157.    128: ifeq    181  
  158.    131: iinc    41  
  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.    160goto    179  
  173.    163: ifnull  169  
  174.    166goto    173  
  175.    169: pop2  
  176.    170goto    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    21  
  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.    107goto    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.    135goto    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.   
  17. }  
 
分享到:
评论

相关推荐

    Adroid动态加载Apk-插件化技术框架(动态代理方案)源码

    Android动态加载Apk-插件化技术(动态代理方案) 一. 什么是插件化 1. 主App(宿主App)加载插件apk的实现 2. 每个业务组件模块形成一个独立的Apk, 然后通过主App动态加载部署业务组件模块Apk的一种方案 二.插件化的...

    局域网中代理服务器、路由器的配置方案

    局域网中代理服务器 路由器的配置方案 网络技术的飞速发展 使企事业单位局域网接入INTERNET共享资源的方式越来越多 就大多数而言 DDN专线以其性能稳定 扩充性好的优势成为普遍采用的方式 DDN方式的连接在硬件的需求...

    java8stream源码-daydayup:天天向上

    java8 stream 源码 Java各种开源库积累 好好学习,天天向上。 演示内容 1)src/main/java org.xpen.audio 播放各种声音格式ogg,mp3,ape,flac org.xpen.chess.puzzle8 ...动态代理方案性能对比,比较了J

    提升Ruby on Rails性能的几个解决方案

    简介 Ruby On Rails 框架自它提出之日起就受到广泛关注,在“不要重复自己”,“约定优于配置”等思想的指导下,Rails 带给 Web 开发者的是极高的开发效率。 ActiveRecord 的灵活让你再也不用配置繁琐的 Hibernate ...

    安卓推送方案及比较

    经常有朋友困扰于Android上面实现推送的技术,希望知道各种方案的优缺点、性能、开发难度等,于是特意写了这篇文章。 方案一: Google官方的服务: 但,通过对比研究发现C2DM机制存在以下缺点: 1)GCM要求Android...

    论文研究-6LoWPAN嵌套移动网络路由优化方案.pdf

    提出一种6LoWPAN嵌套移动网络路由优化方案,在此方案中,6LoWPAN...从理论和仿真两个角度对所提出的路由优化方案的路由优化开销、路由延迟及路由代价等性能参数进行了比较分析,分析结果验证了本方案的有效性和高效性。

    HTTPS 代理-SNI Proxy-WebSocket-Java

    网上搜了一圈,也没找到简单的解决方案。用NGINX折腾了一天,但搭出来的系统很不稳定。干脆用java自己写了个小程序,性能当然和squid、nginx之类的没法比,还好我们的系统负荷不是很重,运行了一个星期基本没问题。 ...

    论文研究-一种MANET地址自动配置方案.pdf

    提出一种MANET地址自动配置方案, 给出了...对MANETConf、Prime DHCP以及本方案的性能参数进行了比较分析, 性能参数包括地址配置代价及地址配置延迟时间, 分析结果验证了本方案的地址配置代价更低, 地址配置延迟更短。

    论文研究-关于CORBA与移动代理结合用于网络管理的研究.pdf

    CORBA和移动代理是目前在分布式网络管理领域中应用得比较广泛的两种技术。在实际应用与研究领域中,它们都在不同的方面呈现出了各自的优势。但是,这两种技术又都存在着不同程度的缺陷。为了弥补移动代理和CORBA的...

    基于SM2的代理保护代理签名的设计与实现

    基于国产密码算法 SM2 数字签名标准,设计了一种代理保护代理签名方案。...最后,利用C语言及Polarssl库对该方案进行了实现,并与SM2数字签名进行了性能比较。分析表明,该算法在性能上具有较好的可用性。

    论文研究-)门限代理签名方案.pdf

    利用节点感知数据的空间相似性,提出了节点故障诊断的算法,通过对邻节点所感知的传感数据进行比较,从而确定检测节点的状态,并将测试状态向网络中其他相邻节点进行扩散。该算法对实现故障节点的检测具有较好的性能...

    论文研究-前向安全的代理盲签名方案.pdf

    基于移动节点的能量级别,采取不同的转发概率,提出了一种Ad Hoc网络基于概率的路由协议——PBR,并与AODV协议进行了性能比较,仿真结果显示,PBR明显改善了系统的能量消耗,延长了网络的存活时间,并且具有较优的可...

    WProxy.rar

    WProxy 绿色免费版 WProxy是一款运行在windows系统上的代理服务器软件,可以给局域网的其他电脑提供代理上网服务,支持HTTP、...支持高并发处理,性能和squid代理比较毫不逊色,具体性能请参考“性能”。 终身免费。

    XX系统方案设计.doc

    解决方案 1 企业级整体解决方案 XX申请管理系统采用当今比较流行和技术比较先进的Microsoft.NET体系作为软件开 发平台和运行平台,以ASP.NET作为主流开发工具和软件运行的主要表现形式,采用当今 软件主要表现形式...

    SQLServer安全及性能优化

    数据库的性能优化主要有两个方面:减少查询比较次数、减少资源的征用。 使用工具Sql Server Profiler优化数据库的性能,减少资源的征用 SqlServer Profiler的功能 Sql Server Profiler的用法  定义跟踪  ...

    服务器故障应急响应方案.docx

    服务器故障应急响应方案 精品资料 服务器故障应急响应方案全文共8页,当前为第1页。服务器故障应急响应方案全文共8页,当前为第1页。 服务器故障应急响应方案全文共8页,当前为第1页。 服务器故障应急响应方案全文共...

    论文研究-基于PMIPv6的域间切换管理方法及性能分析.pdf

    针对代理移动IPv6(PMIPv6)中域间切换时延较大的问题,提出了一种基于PMIPv6的域间切换管理方案。新方案通过在PMIPv6域间发送PBU绑定更新消息,使得切换目标PMIPv6域提前知道移动节点(MN)的家乡网络前缀,避免了...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    10.7.6 CHM与OSWatcher对比 10.8本章小结 第11章 最高可用性 11.1最高可用性架构 11.1.1 Data Guard优势 11.1.2客户端Failover 11.1.3 Data Guard配置 11.1.4 Standby数据库 11.1.5 Data Guard保护模式 ...

Global site tag (gtag.js) - Google Analytics