import org.objectweb.asm.*; import org.objectweb.asm.Type; public class ReflectASMDemo { public static void main(String[] args) { int access = Opcodes.ACC_PUBLIC; String className = "com.example.MyClass"; String superName = Type.getInternalName(Object.class); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V1_8, access, className, null, superName, null); MethodVisitor constructor = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); constructor.visitCode(); constructor.visitVarInsn(Opcodes.ALOAD, 0); constructor.visitMethodInsn(Opcodes.INVOKESPECIAL, superName, "<init>", "()V", false); constructor.visitInsn(Opcodes.RETURN); constructor.visitMaxs(1, 1); constructor.visitEnd(); MethodVisitor method = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "sayHello", "()V", null, null); method.visitCode(); method.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); method.visitLdcInsn("Hello, ReflectASM!"); method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); method.visitInsn(Opcodes.RETURN); method.visitMaxs(2, 0); method.visitEnd(); byte[] byteCode = cw.toByteArray(); MyClassClassLoader loader = new MyClassClassLoader(); Class<?> myClass = loader.defineClass(className, byteCode); try { Object instance = myClass.getDeclaredConstructor().newInstance(); myClass.getMethod("sayHello").invoke(instance); } catch (Exception e) { e.printStackTrace(); } } static class MyClassClassLoader extends ClassLoader { public Class<?> defineClass(String name, byte[] b) { return defineClass(name, b, 0, b.length); } } }


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