import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicProxyExample { public static void main(String[] args) { byte[] classData = generateProxyClassData(MyInterface.class); MyInterface proxy = ProxyGenerator.createProxy(classData); proxy.sayHello(); } private static byte[] generateProxyClassData(Class interfaze) { String className = interfaze.getSimpleName() + "Proxy"; ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", new String[]{interfaze.getName()}); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "sayHello", "()V", null, null); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("Hello World!"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(2, 1); mv.visitEnd(); cw.visitEnd(); return cw.toByteArray(); } } class ProxyGenerator extends ClassLoader { public static MyInterface createProxy(byte[] classData) { ProxyGenerator classLoader = new ProxyGenerator(); Class proxyClass = classLoader.defineClass(null, classData, 0, classData.length); try { return (MyInterface) proxyClass.newInstance(); e.printStackTrace(); } return null; } } interface MyInterface { void sayHello(); }


上一篇:
下一篇:
切换中文