|
@@ -0,0 +1,221 @@
|
|
|
+package com.sf.design.proxy.self;
|
|
|
+
|
|
|
+
|
|
|
+import org.springframework.asm.*;
|
|
|
+
|
|
|
+public class $Proxy0Dump implements Opcodes {
|
|
|
+
|
|
|
+ public static byte[] dump() throws Exception {
|
|
|
+
|
|
|
+ ClassWriter classWriter = new ClassWriter(0);
|
|
|
+ FieldVisitor fieldVisitor;
|
|
|
+ RecordComponentVisitor recordComponentVisitor;
|
|
|
+ MethodVisitor methodVisitor;
|
|
|
+ AnnotationVisitor annotationVisitor0;
|
|
|
+
|
|
|
+ classWriter.visit(V17, ACC_PUBLIC | ACC_SUPER, "com/sf/design/proxy/self/$Proxy0", null, "java/lang/reflect/Proxy", new String[]{"com/sf/design/proxy/self/MyJdkProxyDemo$Life"});
|
|
|
+
|
|
|
+ classWriter.visitSource("$Proxy0.java", null);
|
|
|
+
|
|
|
+ classWriter.visitInnerClass("com/sf/design/proxy/self/MyJdkProxyDemo$Life", "com/sf/design/proxy/self/MyJdkProxyDemo", "Life", ACC_STATIC | ACC_ABSTRACT | ACC_INTERFACE);
|
|
|
+
|
|
|
+ {
|
|
|
+ fieldVisitor = classWriter.visitField(ACC_STATIC, "learn", "Ljava/lang/reflect/Method;", null, null);
|
|
|
+ fieldVisitor.visitEnd();
|
|
|
+ }
|
|
|
+ {
|
|
|
+ fieldVisitor = classWriter.visitField(ACC_STATIC, "sleep", "Ljava/lang/reflect/Method;", null, null);
|
|
|
+ fieldVisitor.visitEnd();
|
|
|
+ }
|
|
|
+ {
|
|
|
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/reflect/InvocationHandler;)V", null, null);
|
|
|
+ methodVisitor.visitParameter("h", 0);
|
|
|
+ methodVisitor.visitCode();
|
|
|
+ Label label0 = new Label();
|
|
|
+ methodVisitor.visitLabel(label0);
|
|
|
+ methodVisitor.visitLineNumber(21, label0);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 0);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 1);
|
|
|
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/Proxy", "<init>", "(Ljava/lang/reflect/InvocationHandler;)V", false);
|
|
|
+ Label label1 = new Label();
|
|
|
+ methodVisitor.visitLabel(label1);
|
|
|
+ methodVisitor.visitLineNumber(22, label1);
|
|
|
+ methodVisitor.visitInsn(RETURN);
|
|
|
+ Label label2 = new Label();
|
|
|
+ methodVisitor.visitLabel(label2);
|
|
|
+ methodVisitor.visitLocalVariable("this", "Lcom/sf/design/proxy/self/$Proxy0;", null, label0, label2, 0);
|
|
|
+ methodVisitor.visitLocalVariable("h", "Ljava/lang/reflect/InvocationHandler;", null, label0, label2, 1);
|
|
|
+ methodVisitor.visitMaxs(2, 2);
|
|
|
+ methodVisitor.visitEnd();
|
|
|
+ }
|
|
|
+ {
|
|
|
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "learn", "()V", null, null);
|
|
|
+ methodVisitor.visitCode();
|
|
|
+ Label label0 = new Label();
|
|
|
+ Label label1 = new Label();
|
|
|
+ Label label2 = new Label();
|
|
|
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/NoSuchMethodException");
|
|
|
+ Label label3 = new Label();
|
|
|
+ methodVisitor.visitTryCatchBlock(label0, label1, label3, "java/lang/Throwable");
|
|
|
+ methodVisitor.visitLabel(label0);
|
|
|
+ methodVisitor.visitLineNumber(53, label0);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 0);
|
|
|
+ methodVisitor.visitFieldInsn(GETFIELD, "com/sf/design/proxy/self/$Proxy0", "h", "Ljava/lang/reflect/InvocationHandler;");
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 0);
|
|
|
+ methodVisitor.visitFieldInsn(GETSTATIC, "com/sf/design/proxy/self/$Proxy0", "learn", "Ljava/lang/reflect/Method;");
|
|
|
+ methodVisitor.visitInsn(ICONST_0);
|
|
|
+ methodVisitor.visitTypeInsn(ANEWARRAY, "java/lang/Object");
|
|
|
+ methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/InvocationHandler", "invoke", "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true);
|
|
|
+ methodVisitor.visitInsn(POP);
|
|
|
+ methodVisitor.visitLabel(label1);
|
|
|
+ methodVisitor.visitLineNumber(58, label1);
|
|
|
+ Label label4 = new Label();
|
|
|
+ methodVisitor.visitJumpInsn(GOTO, label4);
|
|
|
+ methodVisitor.visitLabel(label2);
|
|
|
+ methodVisitor.visitLineNumber(54, label2);
|
|
|
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/NoSuchMethodException"});
|
|
|
+ methodVisitor.visitVarInsn(ASTORE, 1);
|
|
|
+ Label label5 = new Label();
|
|
|
+ methodVisitor.visitLabel(label5);
|
|
|
+ methodVisitor.visitLineNumber(55, label5);
|
|
|
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
|
|
|
+ methodVisitor.visitInsn(DUP);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 1);
|
|
|
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/Throwable;)V", false);
|
|
|
+ methodVisitor.visitInsn(ATHROW);
|
|
|
+ methodVisitor.visitLabel(label3);
|
|
|
+ methodVisitor.visitLineNumber(56, label3);
|
|
|
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/Throwable"});
|
|
|
+ methodVisitor.visitVarInsn(ASTORE, 1);
|
|
|
+ Label label6 = new Label();
|
|
|
+ methodVisitor.visitLabel(label6);
|
|
|
+ methodVisitor.visitLineNumber(57, label6);
|
|
|
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
|
|
|
+ methodVisitor.visitInsn(DUP);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 1);
|
|
|
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/Throwable;)V", false);
|
|
|
+ methodVisitor.visitInsn(ATHROW);
|
|
|
+ methodVisitor.visitLabel(label4);
|
|
|
+ methodVisitor.visitLineNumber(59, label4);
|
|
|
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
|
|
|
+ methodVisitor.visitInsn(RETURN);
|
|
|
+ Label label7 = new Label();
|
|
|
+ methodVisitor.visitLabel(label7);
|
|
|
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/NoSuchMethodException;", null, label5, label3, 1);
|
|
|
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Throwable;", null, label6, label4, 1);
|
|
|
+ methodVisitor.visitLocalVariable("this", "Lcom/sf/design/proxy/self/$Proxy0;", null, label0, label7, 0);
|
|
|
+ methodVisitor.visitMaxs(4, 2);
|
|
|
+ methodVisitor.visitEnd();
|
|
|
+ }
|
|
|
+ {
|
|
|
+ methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "sleep", "()Ljava/lang/String;", null, null);
|
|
|
+ methodVisitor.visitCode();
|
|
|
+ Label label0 = new Label();
|
|
|
+ Label label1 = new Label();
|
|
|
+ Label label2 = new Label();
|
|
|
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/NoSuchMethodException");
|
|
|
+ Label label3 = new Label();
|
|
|
+ methodVisitor.visitTryCatchBlock(label0, label1, label3, "java/lang/Throwable");
|
|
|
+ methodVisitor.visitLabel(label0);
|
|
|
+ methodVisitor.visitLineNumber(67, label0);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 0);
|
|
|
+ methodVisitor.visitFieldInsn(GETFIELD, "com/sf/design/proxy/self/$Proxy0", "h", "Ljava/lang/reflect/InvocationHandler;");
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 0);
|
|
|
+ methodVisitor.visitFieldInsn(GETSTATIC, "com/sf/design/proxy/self/$Proxy0", "sleep", "Ljava/lang/reflect/Method;");
|
|
|
+ methodVisitor.visitInsn(ICONST_0);
|
|
|
+ methodVisitor.visitTypeInsn(ANEWARRAY, "java/lang/Object");
|
|
|
+ methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/InvocationHandler", "invoke", "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true);
|
|
|
+ methodVisitor.visitVarInsn(ASTORE, 1);
|
|
|
+ Label label4 = new Label();
|
|
|
+ methodVisitor.visitLabel(label4);
|
|
|
+ methodVisitor.visitLineNumber(68, label4);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 1);
|
|
|
+ methodVisitor.visitTypeInsn(CHECKCAST, "java/lang/String");
|
|
|
+ methodVisitor.visitLabel(label1);
|
|
|
+ methodVisitor.visitInsn(ARETURN);
|
|
|
+ methodVisitor.visitLabel(label2);
|
|
|
+ methodVisitor.visitLineNumber(69, label2);
|
|
|
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/NoSuchMethodException"});
|
|
|
+ methodVisitor.visitVarInsn(ASTORE, 1);
|
|
|
+ Label label5 = new Label();
|
|
|
+ methodVisitor.visitLabel(label5);
|
|
|
+ methodVisitor.visitLineNumber(70, label5);
|
|
|
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
|
|
|
+ methodVisitor.visitInsn(DUP);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 1);
|
|
|
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/Throwable;)V", false);
|
|
|
+ methodVisitor.visitInsn(ATHROW);
|
|
|
+ methodVisitor.visitLabel(label3);
|
|
|
+ methodVisitor.visitLineNumber(71, label3);
|
|
|
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/Throwable"});
|
|
|
+ methodVisitor.visitVarInsn(ASTORE, 1);
|
|
|
+ Label label6 = new Label();
|
|
|
+ methodVisitor.visitLabel(label6);
|
|
|
+ methodVisitor.visitLineNumber(72, label6);
|
|
|
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
|
|
|
+ methodVisitor.visitInsn(DUP);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 1);
|
|
|
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/Throwable;)V", false);
|
|
|
+ methodVisitor.visitInsn(ATHROW);
|
|
|
+ Label label7 = new Label();
|
|
|
+ methodVisitor.visitLabel(label7);
|
|
|
+ methodVisitor.visitLocalVariable("result", "Ljava/lang/Object;", null, label4, label2, 1);
|
|
|
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/NoSuchMethodException;", null, label5, label3, 1);
|
|
|
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/Throwable;", null, label6, label7, 1);
|
|
|
+ methodVisitor.visitLocalVariable("this", "Lcom/sf/design/proxy/self/$Proxy0;", null, label0, label7, 0);
|
|
|
+ methodVisitor.visitMaxs(4, 2);
|
|
|
+ methodVisitor.visitEnd();
|
|
|
+ }
|
|
|
+ {
|
|
|
+ methodVisitor = classWriter.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
|
|
|
+ methodVisitor.visitCode();
|
|
|
+ Label label0 = new Label();
|
|
|
+ Label label1 = new Label();
|
|
|
+ Label label2 = new Label();
|
|
|
+ methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/NoSuchMethodException");
|
|
|
+ methodVisitor.visitLabel(label0);
|
|
|
+ methodVisitor.visitLineNumber(41, label0);
|
|
|
+ methodVisitor.visitLdcInsn(Type.getType("Lcom/sf/design/proxy/self/MyJdkProxyDemo$Life;"));
|
|
|
+ methodVisitor.visitLdcInsn("learn");
|
|
|
+ methodVisitor.visitInsn(ICONST_0);
|
|
|
+ methodVisitor.visitTypeInsn(ANEWARRAY, "java/lang/Class");
|
|
|
+ methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaredMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false);
|
|
|
+ methodVisitor.visitFieldInsn(PUTSTATIC, "com/sf/design/proxy/self/$Proxy0", "learn", "Ljava/lang/reflect/Method;");
|
|
|
+ Label label3 = new Label();
|
|
|
+ methodVisitor.visitLabel(label3);
|
|
|
+ methodVisitor.visitLineNumber(42, label3);
|
|
|
+ methodVisitor.visitLdcInsn(Type.getType("Lcom/sf/design/proxy/self/MyJdkProxyDemo$Life;"));
|
|
|
+ methodVisitor.visitLdcInsn("sleep");
|
|
|
+ methodVisitor.visitInsn(ICONST_0);
|
|
|
+ methodVisitor.visitTypeInsn(ANEWARRAY, "java/lang/Class");
|
|
|
+ methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaredMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;", false);
|
|
|
+ methodVisitor.visitFieldInsn(PUTSTATIC, "com/sf/design/proxy/self/$Proxy0", "sleep", "Ljava/lang/reflect/Method;");
|
|
|
+ methodVisitor.visitLabel(label1);
|
|
|
+ methodVisitor.visitLineNumber(45, label1);
|
|
|
+ Label label4 = new Label();
|
|
|
+ methodVisitor.visitJumpInsn(GOTO, label4);
|
|
|
+ methodVisitor.visitLabel(label2);
|
|
|
+ methodVisitor.visitLineNumber(43, label2);
|
|
|
+ methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[]{"java/lang/NoSuchMethodException"});
|
|
|
+ methodVisitor.visitVarInsn(ASTORE, 0);
|
|
|
+ Label label5 = new Label();
|
|
|
+ methodVisitor.visitLabel(label5);
|
|
|
+ methodVisitor.visitLineNumber(44, label5);
|
|
|
+ methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
|
|
|
+ methodVisitor.visitInsn(DUP);
|
|
|
+ methodVisitor.visitVarInsn(ALOAD, 0);
|
|
|
+ methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/Throwable;)V", false);
|
|
|
+ methodVisitor.visitInsn(ATHROW);
|
|
|
+ methodVisitor.visitLabel(label4);
|
|
|
+ methodVisitor.visitLineNumber(46, label4);
|
|
|
+ methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
|
|
|
+ methodVisitor.visitInsn(RETURN);
|
|
|
+ methodVisitor.visitLocalVariable("e", "Ljava/lang/NoSuchMethodException;", null, label5, label4, 0);
|
|
|
+ methodVisitor.visitMaxs(3, 1);
|
|
|
+ methodVisitor.visitEnd();
|
|
|
+ }
|
|
|
+ classWriter.visitEnd();
|
|
|
+
|
|
|
+ return classWriter.toByteArray();
|
|
|
+ }
|
|
|
+}
|