import jdk.internal.org.objectweb.asm.ClassWriter; import static jdk.internal.org.objectweb.asm.Opcodes.*; public class HelloWorldGenerator { public static void main(String[] args) throws Exception { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(V1_8, ACC_PUBLIC, "HelloWorld", null, "java/lang/Object", null); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("Hello, world!"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); mv.visitInsn(RETURN); mv.visitMaxs(2, 2); mv.visitEnd(); cw.visitEnd(); byte[] code = cw.toByteArray(); ClassLoader classLoader = new ByteArrayClassLoader(); Class<?> clazz = classLoader.defineClass("HelloWorld", code); Method method = clazz.getMethod("main", String[].class); method.invoke(null, new Object[]{null}); } static class ByteArrayClassLoader extends ClassLoader { public Class<?> defineClass(String name, byte[] code) { return defineClass(name, code, 0, code.length); } } }


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