package com.jarvis.cache.aop.asm;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
public class AddSecurityCheckClassAdapter extends ClassVisitor implements Opcodes {
private String enhancedSuperName;
public AddSecurityCheckClassAdapter(ClassVisitor cv) {
// Responsechain 的下一个 ClassVisitor,这里我们将传入 ClassWriter,
// 负责改写后代码的输出
super(ASM5, cv);
}
@Override
public void visit(final int version, final int access, final String name, final String signature, final String superName, final String[] interfaces) {
String enhancedName=name + "$EnhancedByASM"; // 改变类命名
enhancedSuperName=name; // 改变父类,这里是”Account”
super.visit(version, access, enhancedName, signature, enhancedSuperName, interfaces);
}
// 重写 visitMethod,访问到 "operation" 方法时,
// 给出自定义 MethodVisitor,实际改写方法内容
@Override
public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature, final String[] exceptions) {
MethodVisitor mv=cv.visitMethod(access, name, desc, signature, exceptions);
MethodVisitor wrappedMv=mv;
if(mv != null) {
if(name.equals("operation")) {
wrappedMv=new AddSecurityCheckMethodAdapter(mv);
} else if(name.equals("<init>")) {
wrappedMv=new ChangeToChildConstructorMethodAdapter(mv, enhancedSuperName, desc, access);
}
}
return wrappedMv;
}
}