import org.objectweb.asm.*;
import org.objectweb.asm.Type;
public class ReflectASMDemo {
public static void main(String[] args) {
int access = Opcodes.ACC_PUBLIC;
String className = "com.example.MyClass";
String superName = Type.getInternalName(Object.class);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
cw.visit(Opcodes.V1_8, access, className, null, superName, null);
MethodVisitor constructor = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
constructor.visitCode();
constructor.visitVarInsn(Opcodes.ALOAD, 0);
constructor.visitMethodInsn(Opcodes.INVOKESPECIAL, superName, "<init>", "()V", false);
constructor.visitInsn(Opcodes.RETURN);
constructor.visitMaxs(1, 1);
constructor.visitEnd();
MethodVisitor method = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "sayHello", "()V", null, null);
method.visitCode();
method.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
method.visitLdcInsn("Hello, ReflectASM!");
method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
method.visitInsn(Opcodes.RETURN);
method.visitMaxs(2, 0);
method.visitEnd();
byte[] byteCode = cw.toByteArray();
MyClassClassLoader loader = new MyClassClassLoader();
Class<?> myClass = loader.defineClass(className, byteCode);
try {
Object instance = myClass.getDeclaredConstructor().newInstance();
myClass.getMethod("sayHello").invoke(instance);
} catch (Exception e) {
e.printStackTrace();
}
}
static class MyClassClassLoader extends ClassLoader {
public Class<?> defineClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}
}