1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 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<Agent> 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)
- }
- }
|