Java 字节码操控框架ASM(三):修改 classes

Account.java

package com.asm.modifyclass;

/**
 * Created by ouer1994 on 2017/2/18.
 */
public class Account {
    public static void main(String args[]) {
        new Account().doAccount();
    }

    public void doAccount() {
        System.out.println("Account doAccount ... ");
    }
}

Generator.java

package com.asm.modifyclass;

import org.objectweb.asm.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Created by ouer1994 on 2017/2/18.
 */
public class Generator {
    public static void main(String args[]) {
        try {
            ClassReader classReader = new ClassReader("com/asm/modifyclass/Account");
            ClassWriter classWriter = new ClassWriter(0);
            ClassVisitor classVisitor = new MyClassAdapter(classWriter, "main", "([Ljava/lang/String;)V");
            classReader.accept(classVisitor, 0);

            byte[] data = classWriter.toByteArray();
            File file = new File("Account.class");
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(data);
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static class MyClassAdapter extends ClassVisitor {

        private String mDesc;
        private String methodName;

        public MyClassAdapter(ClassVisitor cv, String methodName, String mDesc) {
            super(Opcodes.ASM4, cv);
            this.mDesc = mDesc;
            this.methodName = methodName;
        }


        @Override
        public MethodVisitor visitMethod(int i, String s, String s1, String s2, String[] strings) {
            // 删除方法
            if (s.equals(methodName) && s1.equals(mDesc)) {
                return null;
            }
            // 修改方法的权限修饰符
            return cv.visitMethod(Opcodes.ACC_PRIVATE, s, s1, s2, strings);
        }
    }

}

为类增加字段

AddFieldAdapter.java

package com.asm.addingclassmembers;

import org.objectweb.asm.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Created by ouer1994 on 2017/2/21.
 */
public class AddFieldAdapter extends ClassVisitor {

    private String fName;
    private int fAcc;
    private String fDesc;
    private boolean isFieldPresent;

    public AddFieldAdapter(ClassVisitor classVisitor, int fAcc, String fDesc, String fName) {
        super(Opcodes.ASM4, classVisitor);
        this.fAcc = fAcc;
        this.fDesc = fDesc;
        this.fName = fName;
    }

    public static void main(String args[]) {
        try {
            ClassReader classReader = new ClassReader("com/asm/modifyclass/Account");
            ClassWriter classWriter = new ClassWriter(0);
            ClassVisitor classVisitor = new AddFieldAdapter(classWriter, Opcodes.ACC_PRIVATE, "I", "added");
            classReader.accept(classVisitor, 0);

            byte[] data = classWriter.toByteArray();
            File file = new File("Account.class");
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(data);
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    @Override
    public FieldVisitor visitField(int i, String s, String s1, String s2, Object o) {
        if (s.equals(fName)) {
            isFieldPresent = true;
        }
        return super.visitField(i, s, s1, s2, o);
    }

    @Override
    public void visitEnd() {
        super.visitEnd();
        if (!isFieldPresent) {
            FieldVisitor fieldVisitor = cv.visitField(fAcc, fName, fDesc, null, null);
            if (fieldVisitor != null) {
                fieldVisitor.visitEnd();
            }

        }
        cv.visitEnd();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

outer199

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值