package com.gradle.ares import org.gradle.api.Project import org.gradle.api.logging.Logger import org.gradle.api.logging.Logging import org.objectweb.asm.ClassVisitor import org.objectweb.asm.FieldVisitor import org.objectweb.asm.MethodVisitor import org.objectweb.asm.Opcodes /** * Created by Glen on 2017/2/8. */ public class ClassAdapter extends ClassVisitor { private Project project; private Logger logger; private boolean modify; private String name; private String superName; private String[] interfaces; private Set addAgents; public ClassAdapter(ClassVisitor cv, Project project) { super(Opcodes.ASM5, cv) this.project = project this.logger = Logging.getLogger(ClassAdapter.class) } @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { super.visit(version, access, name, signature, superName, interfaces) this.name = name this.superName = superName this.interfaces = interfaces debug("class:" + name + "_" + superName + "_" + interfaces) } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions) def agent = MethodAgentVisitor.getAgent(access, name, desc) if (agent != null) { modify = true debug("method:" + access + "_" + name + "_" + desc) mv = new MethodAgentVisitor(mv, agent) } agent = MethodLifeCycleVisitor.getAgent(superName, access, name, desc) if (agent != null) { debug("lifecycle:" + access + "_" + name + "_" + desc) if (addAgents == null) addAgents = new HashSet<>(); addAgents.add(agent) modify = true mv = new MethodLifeCycleVisitor(mv, this.name, agent) } return mv } @Override FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { return super.visitField(access, name, desc, signature, value) } @Override void visitEnd() { if (addAgents != null) { MethodLifeCycleVisitor.addMethods(addAgents, this.name, this.superName, this.cv) } super.visitEnd() } boolean getModify() { return modify } private void debug(def msg) { this.logger.lifecycle(":" + this.project.name + ":" + msg) } }