package eu.mikroskeem.bytecodehackery; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Type; import static org.objectweb.asm.Opcodes.*; public class Main { private Main() throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); /* Generate class */ cw.visit(V1_8, ACC_PUBLIC, (getClass().getPackage().getName() +".kek.Topkek").replaceAll("\\.", "/"), null, "java/lang/Object", new String[]{Type.getInternalName(TestInterface.class)}); /* Generate constructor */ MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); mv.visitVarInsn(ALOAD, 0); /* Must-have for all classes */ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); /* Generate toString method */ String toStringDesc = String.format("(%s)%s", "", Type.getDescriptor(String.class)); mv = cw.visitMethod(ACC_PUBLIC, "toString", toStringDesc, null, null); mv.visitLdcInsn("TOPKEK LMAUUU"); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); /* Generate a() method */ String aDesc = String.format("(%s)%s", "", Type.getDescriptor(String.class)); mv = cw.visitMethod(ACC_PUBLIC, "a", aDesc, null, null); mv.visitLdcInsn("some a() call"); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); mv = cw.visitMethod(ACC_PUBLIC, "b", "()Ljava/util/List;", "()Ljava/util/List;", null); mv.visitCode(); mv.visitTypeInsn(NEW, "java/util/ArrayList"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "", "()V", false); mv.visitVarInsn(ASTORE, 1); mv.visitVarInsn(ALOAD, 1); mv.visitLdcInsn("kek"); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z", true); mv.visitVarInsn(ALOAD, 1); mv.visitLdcInsn("ayy lmao"); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "add", "(Ljava/lang/Object;)Z", true); mv.visitInsn(POP); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ARETURN); mv.visitMaxs(2, 2); mv.visitEnd(); /* Class end */ cw.visitEnd(); /* Load that class */ Class a = GeneratedClassLoader.getLoader(this.getClass().getClassLoader()) .defineClass(getClass().getPackage().getName() +".kek.Topkek", cw.toByteArray()); TestInterface b = (TestInterface) a.newInstance(); System.out.println(b.toString()); System.out.println(b.a()); System.out.println(b.b()); } public static void main(String... a) throws Exception { new Main(); } }