import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import com.esotericsoftware.reflectasm.MethodAccess;
public class ReflectASMExample {
public static void main(String[] args) throws Exception {
ClassWriter cw = new ClassWriter(0);
cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC, "GeneratedClass", null, "java/lang/Object", null);
cw.visitField(Opcodes.ACC_PRIVATE, "name", "Ljava/lang/String;", null, null).visitEnd();
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "greet", "()Ljava/lang/String;", null, null);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, "GeneratedClass", "name", "Ljava/lang/String;");
mv.visitInsn(Opcodes.ARETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
cw.visitEnd();
byte[] code = cw.toByteArray();
Class<?> generatedClass = new CustomClassLoader().defineClass("GeneratedClass", code);
Object instance = generatedClass.getDeclaredConstructor().newInstance();
MethodAccess methodAccess = MethodAccess.get(generatedClass);
methodAccess.invoke(instance, "setName", "John Doe");
String name = (String) methodAccess.invoke(instance, "greet");
System.out.println("Hello, " + name);
}
}
class CustomClassLoader extends ClassLoader {
public Class<?> defineClass(String name, byte[] code) {
return defineClass(name, code, 0, code.length);
}
}