import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Type; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Label; import org.objectweb.asm.Handle; import org.objectweb.asm.commons.GeneratorAdapter; public class ReflectASMExample { public static void main(String[] args) throws Exception { cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "ExampleClass", null, "java/lang/Object", null); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Object.class), "<init>", "()V", false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("exampleMethod", "()V"), null, null, cw); mg.visitCode(); mg.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mg.visitLdcInsn("Hello, ReflectASM!"); mg.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); mg.visitInsn(Opcodes.RETURN); mg.visitMaxs(0, 0); mg.visitEnd(); cw.visitEnd(); byte[] byteCode = cw.toByteArray(); // Save byteCode into a .class file for inspection Class<?> exampleClass = new ByteArrayClassLoader().loadClass(byteCode); Object example = exampleClass.getDeclaredConstructor().newInstance(); example.getClass().getMethod("exampleMethod").invoke(example); } }


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