import jdk.internal.org.objectweb.asm.Opcodes;
import jdk.internal.org.objectweb.asm.Type;
import jdk.internal.org.objectweb.asm.commons.GeneratorAdapter;
import jdk.internal.org.objectweb.asm.commons.Method;
public class JitescriptExample {
public static void main(String[] args) throws Exception {
JiteClass jiteClass = new JiteClass("DynamicClass");
Type fieldType = Type.getType(String.class);
jiteClass.defineField(Opcodes.ACC_PRIVATE, "name", fieldType);
jiteClass.defineMethod(Opcodes.ACC_PUBLIC, "<init>", Type.VOID_TYPE, new Type[] { fieldType }, new GeneratorAdapter(ACC_PUBLIC, new Method("<init>", Type.VOID_TYPE, new Type[] { fieldType }), ACC_PUBLIC) {
@Override
public void visitCode() {
super.visitCode();
loadThis();
loadArg(0);
putField(Type.getType("DynamicClass"), "name", fieldType);
returnValue();
endMethod();
}
});
jiteClass.defineMethod(Opcodes.ACC_PUBLIC, "sayHello", Type.VOID_TYPE, new Type[0], new GeneratorAdapter(Opcodes.ACC_PUBLIC, new Method("sayHello", Type.VOID_TYPE, new Type[0]), Opcodes.ACC_PUBLIC) {
@Override
public void visitCode() {
super.visitCode();
getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
loadThis();
getField(Type.getType("DynamicClass"), "name", fieldType);
invokeVirtual(Type.getType(PrintStream.class), new Method("println", Type.VOID_TYPE, new Type[] { Type.getType(String.class) }));
returnValue();
endMethod();
}
});
byte[] byteCode = jiteClass.toBytes();
Class<?> dynamicClass = new ByteArrayClassLoader().defineClass("DynamicClass", byteCode);
Object instance = dynamicClass.getDeclaredConstructor(String.class).newInstance("John Doe");
Method method = dynamicClass.getMethod("sayHello");
method.invoke(instance);
}
}