public class HelloWorld {
public void sayHello() {
System.out.println("Hello, World!");
}
}
import org.objectweb.asm.*;
public class HelloWorldClassVisitor extends ClassVisitor {
public HelloWorldClassVisitor(ClassVisitor cv) {
super(Opcodes.ASM7, cv);
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (name.equals("sayHello")) {
MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
return new HelloWorldMethodVisitor(mv);
}
return super.visitMethod(access, name, desc, signature, exceptions);
}
}
import org.objectweb.asm.*;
public class HelloWorldMethodVisitor extends MethodVisitor {
public HelloWorldMethodVisitor(MethodVisitor mv) {
super(Opcodes.ASM7, mv);
}
@Override
public void visitCode() {
super.visitCode();
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mv.visitLdcInsn("Enhanced Hello, World!");
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
}
}
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
public class Main {
public static void main(String[] args) throws Exception {
ClassReader cr = new ClassReader("HelloWorld");
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
ClassVisitor cv = new HelloWorldClassVisitor(cw);
cr.accept(cv, ClassReader.EXPAND_FRAMES);
byte[] enhancedBytecode = cw.toByteArray();
CustomClassLoader classLoader = new CustomClassLoader();
Class<?> enhancedClass = classLoader.defineClass("HelloWorld", enhancedBytecode);
HelloWorld enhancedHelloWorld = (HelloWorld) enhancedClass.newInstance();
enhancedHelloWorld.sayHello();
}
}