12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- package com.gradle.ares
- import org.objectweb.asm.MethodVisitor
- import org.objectweb.asm.Opcodes
- /**
- * Created by Glen on 2017/2/8.
- */
- public class MethodAgentVisitor extends MethodVisitor {
- public final static String AgentClass = "com/uddream/plugin/Agent";
- public final static Agent[] Modify = [
- new Agent("onClick", "(Landroid/view/View;)V"),
- new Agent("onCheckedChanged", "(Landroid/widget/CompoundButton;Z)V")
- ] as Agent[]
- public final static Agent getAgent(int access, String name, String desc) {
- for (Agent item : Modify) {
- if (item.name.equals(name) && item.desc.equals(desc)) {
- item.access = access
- return item
- }
- }
- return null
- }
- private int pCount;
- private Agent agent;
- MethodAgentVisitor(MethodVisitor mv, Agent agent) {
- super(Opcodes.ASM5, mv)
- this.agent = agent
- for (def item : agent.desc.substring(1, agent.desc.indexOf(")")).split(";")) {
- if (!item.equals("")) this.pCount++
- }
- }
- @Override
- void visitCode() {
- super.visitCode()
- for (int i = 1; i <= pCount; i++) visitVarInsn(Opcodes.ALOAD, i)
- visitMethodInsn(Opcodes.INVOKESTATIC, AgentClass, agent.name + "Pre", agent.desc, false)
- }
- @Override
- public void visitInsn(int opcode) {
- if (opcode == Opcodes.RETURN) {
- for (int i = 1; i <= pCount; i++) visitVarInsn(Opcodes.ALOAD, i)
- visitMethodInsn(Opcodes.INVOKESTATIC, AgentClass, agent.name, agent.desc, false)
- }
- super.visitInsn(opcode);
- }
- }
|