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


    原文 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.   
  • 相关阅读:
    Javascript对象原型prototype和继承
    Javascript(js)使用function定义构造函数
    phpExcel中文帮助手册
    php curl_init函数用法
    nginx启动,重启,关闭命令
    Nginx配置文件详细说明
    Nginx 简单的负载均衡配置示例
    MySQL数据库的同步配置
    ucenter home 视频增加缩略图
    web分词程序和算法
  • 原文地址:https://www.cnblogs.com/devilwind/p/7544401.html
Copyright © 2020-2023  润新知