import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Type;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Label;
import org.objectweb.asm.Handle;
import org.objectweb.asm.commons.GeneratorAdapter;
public class ReflectASMExample {
public static void main(String[] args) throws Exception {
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "ExampleClass", null, "java/lang/Object", null);
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Object.class), "<init>", "()V", false);
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("exampleMethod", "()V"), null, null, cw);
mg.visitCode();
mg.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mg.visitLdcInsn("Hello, ReflectASM!");
mg.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
mg.visitInsn(Opcodes.RETURN);
mg.visitMaxs(0, 0);
mg.visitEnd();
cw.visitEnd();
byte[] byteCode = cw.toByteArray();
// Save byteCode into a .class file for inspection
Class<?> exampleClass = new ByteArrayClassLoader().loadClass(byteCode);
Object example = exampleClass.getDeclaredConstructor().newInstance();
example.getClass().getMethod("exampleMethod").invoke(example);
}
}