MethodAgentVisitor.groovy 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package com.gradle.ares
  2. import org.objectweb.asm.MethodVisitor
  3. import org.objectweb.asm.Opcodes
  4. /**
  5. * Created by Glen on 2017/2/8.
  6. */
  7. public class MethodAgentVisitor extends MethodVisitor {
  8. public final static String AgentClass = "com/uddream/plugin/Agent";
  9. public final static Agent[] Modify = [
  10. new Agent("onClick", "(Landroid/view/View;)V"),
  11. new Agent("onCheckedChanged", "(Landroid/widget/CompoundButton;Z)V")
  12. ] as Agent[]
  13. public final static Agent getAgent(int access, String name, String desc) {
  14. for (Agent item : Modify) {
  15. if (item.name.equals(name) && item.desc.equals(desc)) {
  16. item.access = access
  17. return item
  18. }
  19. }
  20. return null
  21. }
  22. private int pCount;
  23. private Agent agent;
  24. MethodAgentVisitor(MethodVisitor mv, Agent agent) {
  25. super(Opcodes.ASM5, mv)
  26. this.agent = agent
  27. for (def item : agent.desc.substring(1, agent.desc.indexOf(")")).split(";")) {
  28. if (!item.equals("")) this.pCount++
  29. }
  30. }
  31. @Override
  32. void visitCode() {
  33. super.visitCode()
  34. for (int i = 1; i <= pCount; i++) visitVarInsn(Opcodes.ALOAD, i)
  35. visitMethodInsn(Opcodes.INVOKESTATIC, AgentClass, agent.name + "Pre", agent.desc, false)
  36. }
  37. @Override
  38. public void visitInsn(int opcode) {
  39. if (opcode == Opcodes.RETURN) {
  40. for (int i = 1; i <= pCount; i++) visitVarInsn(Opcodes.ALOAD, i)
  41. visitMethodInsn(Opcodes.INVOKESTATIC, AgentClass, agent.name, agent.desc, false)
  42. }
  43. super.visitInsn(opcode);
  44. }
  45. }