根据制定的方法名和修饰符删除一个方法:
public class RemoveMethodAdapter extends ClassAdapter {
private String mName;
private String mDesc;
public RemoveMethodAdapter(ClassVisitor cv, String name, String desc) {
super(cv);
mName = name;
mDesc = desc;
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc,
String signature, String[] exceptions) {
if (name.equals(mName) && desc.equals(mDesc)) {
return null;
}
return super.visitMethod(access, name, desc, signature, exceptions);
}
}
ClassWriter cw2 = new ClassWriter(0);
ClassAdapter ca2 = new RemoveMethodAdapter(cw2, "compareTo", "(Ljava/lang/Object;)I");
ClassReader cr4 = new ClassReader(b1);
cr4.accept(ca2, 0);
byte[] b2 = cw2.toByteArray();
ClassReader cr5 = new ClassReader(b2);
cr5.accept(cp, 0);
增加类成员:
public class AddFieldAdapter extends ClassAdapter {
private int fAcc;
private String mName;
private String mDesc;
private boolean isFieldPresent;
public AddFieldAdapter(ClassVisitor cv, int acc, String name, String desc) {
super(cv);
fAcc = acc;
mName = name;
mDesc = desc;
}
@Override
public FieldVisitor visitField(int access, String name, String desc,
String signature, Object value) {
if (name.equals(desc)) {
isFieldPresent = true;
}
return super.visitField(access, name, desc, signature, value);
}
@Override
public void visitEnd() {
if (!isFieldPresent) {
FieldVisitor fv = cv.visitField(fAcc, mName, mDesc, null, null);
if (fv != null) {
fv.visitEnd();
}
}
super.visitEnd();
}
}