78 lines
2.9 KiB
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();
|
|
}
|
|
}
|