public class MyClass { public void myMethod() { System.out.println("Hello, ASM!"); } } public class MyClassModified { public void myMethod() { System.out.println("Hello, Modified ASM!"); System.out.println("This is an extra functionality added by ASM."); } } public class ASMExample { public static void main(String[] args) throws Exception { ClassReader classReader = new ClassReader("MyClass"); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); ClassVisitor classVisitor = new ClassVisitor(Opcodes.ASM5, classWriter) { @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { super.visit(version, access, "MyClassModified", signature, superName, interfaces); } }; MethodVisitor methodVisitor = new MethodVisitor(Opcodes.ASM5, classVisitor.visitMethod(Opcodes.ACC_PUBLIC, "myMethod", "()V", null, null)) { @Override public void visitCode() { super.visitCode(); visitLdcInsn("Hello, Modified ASM!"); visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); visitLdcInsn("This is an extra functionality added by ASM."); visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); } }; classReader.accept(classVisitor, ClassReader.EXPAND_FRAMES); byte[] modifiedClass = classWriter.toByteArray(); Class<?> modifiedClassObj = new MyClassLoader().defineClass("MyClassModified", modifiedClass); Object instance = modifiedClassObj.getConstructor().newInstance(); modifiedClassObj.getMethod("myMethod").invoke(instance); } } public class MyClassLoader extends ClassLoader { public Class<?> defineClass(String name, byte[] b) { return defineClass(name, b, 0, b.length); } }


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