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);
}
}