java asm 书_Java ASM 简单例子

###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();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值