bytecodehackery/src/main/java/eu/mikroskeem/bytecodehackery/Main.java

78 lines
2.9 KiB
Java

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, "<init>", "()V", null, null);
mv.visitVarInsn(ALOAD, 0);
/* Must-have for all classes */
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()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<Ljava/lang/String;>;", null);
mv.visitCode();
mv.visitTypeInsn(NEW, "java/util/ArrayList");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()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();
}
}