MethodAgentVisitor.groovy 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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 MethodBaseVisitor {
  8. public final static MethodModel[] Modify = [
  9. new MethodModel("onClick", "(Landroid/view/View;)V", 1),//view
  10. new MethodModel("onClick", "(Landroid/content/DialogInterface;I)V", 2),//dialog
  11. new MethodModel("onItemClick", "(Landroid/widget/AdapterView;Landroid/view/View;IJ)V", 4),//list view
  12. new MethodModel("onTabSelected", "(Landroid/support/design/widget/TabLayout\$Tab;)V", 1),//design lib tab layout
  13. new MethodModel("onCheckedChanged", "(Landroid/widget/CompoundButton;Z)V", 2)
  14. ] as MethodModel[]
  15. public
  16. static MethodModel getAgent(int access, String className, String superName, String name, String desc) {
  17. for (MethodModel item : Modify) {
  18. if (item.name.equals(name) && item.desc.equals(desc)) {
  19. item.access = access
  20. item.className = className
  21. item.superName = superName
  22. return item
  23. }
  24. }
  25. return null
  26. }
  27. MethodAgentVisitor(MethodVisitor mv, MethodModel agent) {
  28. super(mv, agent)
  29. }
  30. @Override
  31. void visitCode() {
  32. super.visitCode()
  33. for (int i = 0; i < this.agent.count; i++) loadArg(i)
  34. visitMethodInsn(Opcodes.INVOKESTATIC, AresValue.AgentClass, this.agent.name + "Pre", this.agent.desc, false)
  35. }
  36. @Override
  37. public void visitInsn(int opcode) {
  38. if (opcode == Opcodes.RETURN) {
  39. for (int i = 0; i < this.agent.count; i++) loadArg(i)
  40. visitMethodInsn(Opcodes.INVOKESTATIC, AresValue.AgentClass, this.agent.name, this.agent.desc, false)
  41. }
  42. super.visitInsn(opcode);
  43. }
  44. }