package tree; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.List; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import static org.objectweb.asm.Opcodes.*; public class ReadWrite { public static void main(String[] args) throws Exception { //read in, build classNode ClassNode classNode=new ClassNode(); ClassReader cr=new ClassReader("sample.Hello"); cr.accept(classNode, 0); //peek at classNode and modifier List<MethodNode> methods=(List<MethodNode>)classNode.methods; for(MethodNode method: methods) { System.out.println("name="+method.name+" desc="+method.desc); InsnList insnList=method.instructions; Iterator ite=insnList.iterator(); while(ite.hasNext()) { AbstractInsnNode insn=(AbstractInsnNode)ite.next(); int opcode=insn.getOpcode(); //add before return: System.out.println("Returning ... ") if (opcode==RETURN) { InsnList tempList=new InsnList(); tempList.add(new FieldInsnNode(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;")); tempList.add(new LdcInsnNode("Returning ... ")); tempList.add(new MethodInsnNode(INVOKEVIRTUAL,"java/io/PrintStream","println", "(Ljava/lang/String;)V")); insnList.insert(insn.getPrevious(), tempList); method.maxStack +=2; } } } //write classNode ClassWriter out=new ClassWriter(0); classNode.accept(out); output("/tmp/sample/Hello.class", out.toByteArray()); } public static void output(String filename, byte[] data) throws IOException { FileOutputStream out=new FileOutputStream(filename); out.write(data); out.close(); } }