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); } }


上一篇:
下一篇:
切换中文