###Test的代码比较简单 public class Test { /** * @param args */ public static void main(String[] args) { test01(); }
static void test01() {
System.out.println("Hello In Test01!");
}
}
###对Test.class进行处理,添加test03的生成及调用 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
public class Test_08 {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:\\Test.class");
ClassReader reader = new ClassReader(fis);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
reader.accept(new MyClassVisivator(cw), 0);
writeToFile(cw.toByteArray(), "D:\\Test.class");
}
static void writeToFile(byte[] bytes, String fileName) {
try {
(new File(fileName)).createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(fileName);
fos.write(bytes);
fos.flush();
} catch (Exception e) {
}finally{
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
static class MyClassVisivator extends ClassAdapter {
ClassVisitor mCv;
public MyClassVisivator(ClassVisitor cv) {
super(cv);
mCv = cv;
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
if ("main".equals(name)) {
MyMethodVisitor mmv = new MyMethodVisitor(mv);
return mmv;
}
return mv;
}
@Override
public void visitEnd() {
MethodVisitor mv = mCv.visitMethod(Opcodes.ACC_STATIC, "test03", "()V", null, null);
if (mv != null) {
mv.visitCode();
mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mv.visitLdcInsn("Hello In Test03!");
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();
}
}
}
static class MyMethodVisitor extends MethodAdapter {
MethodVisitor mMv;
public MyMethodVisitor(MethodVisitor mv) {
super(mv);
mMv = mv;
}
@Override
public void visitInsn(int opcode) {
if (opcode == Opcodes.RETURN) {
System.out.println("Debug");
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "Test", "test03", "()V");
}
super.visitInsn(opcode);
}
@Override
public void visitEnd() {
super.visitEnd();
}
}
}