ClassWriter cw = new ClassWriter(0); cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Example", null, "java/lang/Object", null); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); 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(); cw.visitEnd(); byte[] bytecode = cw.toByteArray(); ClassLoader loader = new ByteArrayClassLoader(); Class<?> exampleClass = loader.defineClass("Example", bytecode); ClassReader cr = new ClassReader(exampleClass); ClassNode cn = new ClassNode(); cr.accept(cn, 0); for (MethodNode mn : cn.methods) { if (mn.name.equals("exampleMethod")) { InsnList instructions = new InsnList(); instructions.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;")); instructions.add(new LdcInsnNode("Hello, World!")); instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false)); mn.instructions.insert(instructions); } } ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cn.accept(cw); byte[] modifiedBytecode = cw.toByteArray(); ClassLoader modifiedLoader = new ByteArrayClassLoader(); Class<?> modifiedClass = modifiedLoader.defineClass("Example", modifiedBytecode); ClassWriter cw = new ClassWriter(0); cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Proxy", null, "Example", null); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "Example", "<init>", "()V", false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); cw.visitEnd(); byte[] bytecode = cw.toByteArray(); ClassLoader loader = new ByteArrayClassLoader(); Class<?> proxyClass = loader.defineClass("Proxy", bytecode);


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