package com.ibm.jasm.asm;
import org.objectweb.asm.*;
/**
* Created by zqhxuyuan on 15-3-19.
*/
public class VistorChain {
public static void main(String[] args) {
}
public void testVisitorChain() throws Exception{
ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS);
ClassAdapter delLoginClassAdaptor = new DelLoginClassAdapter(classWriter);
ClassAdapter accessClassAdaptor = new AccessClassAdapter(delLoginClassAdaptor);
// 增加新的类、方法、字段
String strFileName = "/home/hadoop/test.class";
ClassReader classReader = new ClassReader(strFileName);
classReader.accept(accessClassAdaptor, ClassReader.SKIP_DEBUG);
}
}
// 删除类的字段、方法、指令:只需在职责链传递过程中中断委派,不访问相应的 visit 方法即可,
// 比如删除方法时只需直接返回 null,而不是返回由 visitMethod方法返回的 MethodVisitor对象。
class DelLoginClassAdapter extends ClassAdapter {
public DelLoginClassAdapter(ClassVisitor cv) {
super(cv);
}
public MethodVisitor visitMethod(final int access, final String name,
final String desc, final String signature, final String[] exceptions) {
if (name.equals("login")) {
return null;
}
return cv.visitMethod(access, name, desc, signature, exceptions);
}
}
// 修改类、字段、方法的名字或修饰符:在职责链传递过程中替换调用参数
class AccessClassAdapter extends ClassAdapter {
public AccessClassAdapter(ClassVisitor cv) {
super(cv);
}
public FieldVisitor visitField(final int access, final String name,
final String desc, final String signature, final Object value) {
int privateAccess = Opcodes.ACC_PRIVATE;
return cv.visitField(privateAccess, name, desc, signature, value);
}
}