MethodAgentVisitor.groovy 1.9 KB

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